#Область ОписаниеПеременных

&НаКлиенте
Перем ВидыНаборовДанных;

&НаКлиенте
Перем ВидыПолейНаборовДанных;

&НаКлиенте
Перем УИ_РедакторКодаКлиентскиеДанные Экспорт;

#КонецОбласти

#Область СобытияФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ИнициализироватьФорму();

	Если Параметры.Свойство("СКД") Тогда
		РежимВыбора=Истина;
		Если ЭтоАдресВременногоХранилища(Параметры.СКД) Тогда
			СКД=ПолучитьИзВременногоХранилища(Параметры.СКД);
		Иначе
			Попытка
				ЧтениеXML = Новый ЧтениеXML;
				ЧтениеXML.УстановитьСтроку(Параметры.СКД);
				СКД= СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("СхемаКомпоновкиДанных"));
			Исключение
				СКД=Неопределено;
			КонецПопытки;
		КонецЕсли;

		Если СКД <> Неопределено Тогда
			ПрочитатьСКДВДанныеФормы(СКД);
		КонецЕсли;
	КонецЕсли;

	Если Не РежимВыбора Тогда
		ЭтаФорма.ПоложениеКоманднойПанели=ПоложениеКоманднойПанелиФормы.Нет;
	КонецЕсли;
	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка,
		Элементы.ГруппаКомандыЧтенияСохраненияСКД);

	УИ_РедакторКодаСервер.ФормаПриСозданииНаСервере(ЭтотОбъект);

	СобытияРедактора = УИ_РедакторКодаСервер.НовыйПараметрыСобытийРедактора();
	СобытияРедактора.ПриИзменении = "НаборыДанныхЗапросПриИзменении";
	УИ_РедакторКодаСервер.СоздатьЭлементыРедактораКода(ЭтотОбъект,
													   "Запрос",
													   Элементы.НаборыДанныхЗапрос,
													   СобытияРедактора,
													   "bsl_query");

КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Если ЭтоАдресВременногоХранилища(АдресПервоначальнойСхемыКомпоновкиДанных) Тогда
		ЗаполнитьВспомогательныеДанныеРесурсов();
	КонецЕсли;
	
	УИ_РедакторКодаКлиент.ФормаПриОткрытии(ЭтотОбъект);
КонецПроцедуры
#КонецОбласти

#Область СобытияЭлементовФормы

&НаКлиенте
Процедура ГруппаЗакладкиРедактораПриСменеСтраницы(Элемент, ТекущаяСтраница)
	Если ТекущаяСтраница = Элементы.ГруппаСтраницаСвязиНаборовДанных Тогда
		ЗаполнитьВспомогательныеДанныеСвязейНаборовДанных();
	ИначеЕсли ТекущаяСтраница = Элементы.ГруппаСтраницаРесурсы Тогда
		ЗаполнитьВспомогательныеДанныеРесурсов();
	ИначеЕсли ТекущаяСтраница = Элементы.ГруппаСтраницаНастройки Тогда
		СобратьСКДПоДаннымФормы();
	КонецЕсли;
КонецПроцедуры

#Область НаборыДанных
&НаКлиенте
Процедура НаборыДанныхВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Если ВыбраннаяСтрока <> ИдентификаторНулевогоНабораДанных Тогда
		Возврат;
	КонецЕсли;

	СтандартнаяОбработка=Ложь;

	Если Элементы.НаборыДанных.Развернут(ВыбраннаяСтрока) Тогда
		Элементы.НаборыДанных.Свернуть(ВыбраннаяСтрока);
	Иначе
		Элементы.НаборыДанных.Развернуть(ВыбраннаяСтрока, Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхПередУдалением(Элемент, Отказ)
	Если Элементы.НаборыДанных.ТекущаяСтрока = ИдентификаторНулевогоНабораДанных Тогда
		Отказ=Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхПередНачаломИзменения(Элемент, Отказ)
	Если Элементы.НаборыДанных.ТекущаяСтрока = ИдентификаторНулевогоНабораДанных Тогда
		Отказ=Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр)
	Отказ=Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПереместитьСтрокуДереваНаборов(ПеремещаемаяСтрока, НовыйРодитель, Уровень = 0)

	Если Уровень = 0 Тогда

		НоваяСтрока = НовыйРодитель.ПолучитьЭлементы().Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока, , "Поля");
		Для Каждого СтрокаПоля Из ПеремещаемаяСтрока.Поля Цикл
			НС=НоваяСтрока.Поля.Добавить();
			ЗаполнитьЗначенияСвойств(НС, СтрокаПоля, , "ВыраженияУпорядочиванияКомпоновкиДанных");

			Для Каждого СтрокаПорядка Из СтрокаПоля.ВыраженияУпорядочиванияКомпоновкиДанных Цикл
				НП=НС.ВыраженияУпорядочиванияКомпоновкиДанных.Добавить();
				ЗаполнитьЗначенияСвойств(НП, СтрокаПорядка);
			КонецЦикла;
		КонецЦикла;

		ПереместитьСтрокуДереваНаборов(ПеремещаемаяСтрока, НоваяСтрока, Уровень + 1);

		Если ПеремещаемаяСтрока.ПолучитьРодителя() = Неопределено Тогда
			Наборыданных.ПолучитьЭлементы().Удалить(ПеремещаемаяСтрока);
		Иначе
			ПеремещаемаяСтрока.ПолучитьРодителя().ПолучитьЭлементы().Удалить(ПеремещаемаяСтрока);
		КонецЕсли;

		Элементы.НаборыДанных.ТекущаяСтрока=НоваяСтрока.ПолучитьИдентификатор();
	Иначе

		Для Каждого Стр Из ПеремещаемаяСтрока.ПолучитьЭлементы() Цикл
			НоваяСтрока = НовыйРодитель.ПолучитьЭлементы().Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока, , "Поля");
			Для Каждого СтрокаПоля Из ПеремещаемаяСтрока.Поля Цикл
				НС=НоваяСтрока.Поля.Добавить();
				ЗаполнитьЗначенияСвойств(НС, СтрокаПоля, , "ВыраженияУпорядочиванияКомпоновкиДанных");

				Для Каждого СтрокаПорядка Из СтрокаПоля.ВыраженияУпорядочиванияКомпоновкиДанных Цикл
					НП=НС.ВыраженияУпорядочиванияКомпоновкиДанных.Добавить();
					ЗаполнитьЗначенияСвойств(НП, СтрокаПорядка);
				КонецЦикла;
			КонецЦикла;

			ПереместитьСтрокуДереваНаборов(Стр, НоваяСтрока, Уровень + 1);
		КонецЦикла;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	СтандартнаяОбработка=Ложь;

	Если ПараметрыПеретаскивания.Действие <> ДействиеПеретаскивания.Перемещение Тогда
		Возврат;
	КонецЕсли;

	СтрокаНабораКуда=НаборыДанных.НайтиПоИдентификатору(Строка);
	СтрокаПеремещения=НаборыДанных.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение);
	РодительскийНабор=СтрокаПеремещения.ПолучитьРодителя();
	ПереместитьСтрокуДереваНаборов(СтрокаПеремещения, СтрокаНабораКуда);
	
	Если РодительскийНабор.Вид = ВидыНаборовДанных.Объединение Тогда
		ЗаполнитьПоляНабораДанныхОбъединениеПоПодчиненнымЗапросам(РодительскийНабор.ПолучитьИдентификатор());
	КонецЕсли;
	Если СтрокаНабораКуда.Вид = ВидыНаборовДанных.Объединение Тогда
		ЗаполнитьПоляНабораДанныхОбъединениеПоПодчиненнымЗапросам(СтрокаНабораКуда.ПолучитьИдентификатор());
	КонецЕсли;
	
	
	//Теперь нужно перезаполнить поля в наборах данных объединение
КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	СтандартнаяОбработка=Ложь;

	Если ПараметрыПеретаскивания.Значение = ИдентификаторНулевогоНабораДанных Тогда
		ПараметрыПеретаскивания.Действие=ДействиеПеретаскивания.Отмена;
		Возврат;
	КонецЕсли;

	СтрокаПеремещения=НаборыДанных.НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение);
	СтрокаОткуда=СтрокаПеремещения.ПолучитьРодителя();
	Если СтрокаОткуда.ПолучитьИдентификатор() = Строка Тогда
		ПараметрыПеретаскивания.Действие=ДействиеПеретаскивания.Отмена;
	КонецЕсли;

	СтрокаКуда=НаборыДанных.НайтиПоИдентификатору(Строка);
	Если СтрокаКуда.Вид <> ВидыНаборовДанных.Корень И СтрокаКуда.Вид <> ВидыНаборовДанных.Объединение Тогда
		ПараметрыПеретаскивания.Действие=ДействиеПеретаскивания.Отмена;
	КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НаборыДанныхПриАктивизацииСтроки(Элемент)
	ТекДанныеНабора=Элементы.НаборыДанных.ТекущиеДанные;
	Если ТекДанныеНабора = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ТекДанныеНабора.Вид = ВидыНаборовДанных.Корень Тогда
		Элементы.ГруппаНаборыДанныхПраваяПанель.ТекущаяСтраница=Элементы.ГруппаНаборыДанныхПраваяПанельИсточникиДанных;
		Возврат;
	КонецЕсли;

	Элементы.ГруппаНаборыДанныхПраваяПанель.ТекущаяСтраница=Элементы.ГруппаНаборыДанныхПраваяПанельДанныеНабора;

	ТекДанныеНабора=Элементы.НаборыДанных.ТекущиеДанные;
	Элементы.ГруппаПанельРедактированияНастроекНабора.Видимость=ТекДанныеНабора.Вид <> ВидыНаборовДанных.Объединение;
	Если ТекДанныеНабора.Вид = ВидыНаборовДанных.Запрос Тогда
		Элементы.ГруппаПанельРедактированияНастроекНабора.ТекущаяСтраница=Элементы.ГруппаСтраницаРедактированияНастроекНабораЗапрос;
		
		СохранитьТекстЗапросаВТекущийНабор();
		УстановитьТекстЗапроса(ТекДанныеНабора.Запрос, Истина, ТекДанныеНабора.ЗапросОриганальный);
	ИначеЕсли ТекДанныеНабора.Вид = ВидыНаборовДанных.Объект Тогда
		Элементы.ГруппаПанельРедактированияНастроекНабора.ТекущаяСтраница=Элементы.ГруппаСтраницаРедактированияНастроекНабораОбъект;
	КонецЕсли;

	Элементы.ПоляНаборДанныхПроверкиИерархии.СписокВыбора.Очистить();
	Элементы.ПоляНаборДанныхПроверкиИерархии.СписокВыбора.Добавить("");

	Для Каждого Набор Из НаборыДанныхВерхнегоУровня() Цикл
		Если Набор.Имя = ТекДанныеНабора.Имя Тогда
			Продолжить;
		КонецЕсли;

		Элементы.ПоляНаборДанныхПроверкиИерархии.СписокВыбора.Добавить(Набор.Имя);
	КонецЦикла;
	
	ИдентификаторСтрокиТекущегоНабораДанных = Элементы.НаборыДанных.ТекущаяСтрока;

	ЗаполнитьСписокВыбораИсточникаДанныхНабора();
	УстановитьДоступностьКнопокДобавленияПолейНабора();
КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхПоляПриАктивизацииСтроки(Элемент)
	УстановитьДоступностьКнопокДобавленияПолейНабора();
КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхЗапросПриИзменении(Элемент, ДополнительныеДанные = Неопределено) Экспорт
	СохранитьТекстЗапросаВТекущийНабор();
	ЗаполнитьПоляНабораДанныхПриИзмененииЗапроса(ИдентификаторСтрокиТекущегоНабораДанных);
КонецПроцедуры
&НаКлиенте
Процедура НаборыДанныхПоляРольПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;

	ТекДанные=Элементы.НаборыДанныхПоля.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	МассивПолейНабора=Новый Массив;
	СтрокаНабора=НаборыДанных.НайтиПоИдентификатору(Элементы.НаборыДанных.ТекущаяСтрока);
	Для Каждого СтрокаПоля Из СтрокаНабора.Поля Цикл
		Если СтрокаПоля.ПутьКДанным = ТекДанные.ПутьКДанным Тогда
			Продолжить;
		КонецЕсли;

		МассивПолейНабора.Добавить(СтрокаПоля.ПутьКДанным);
	КонецЦикла;

	ПараметрыФормы=Новый Структура;
	ПараметрыФормы.Вставить("Роль", ТекДанные.Роль);
	ПараметрыФормы.Вставить("МассивПолейНабора", МассивПолейНабора);
	ПараметрыФормы.Вставить("ПутьКДанным", ТекДанные.ПутьКДанным);

	ПараметрыОповещения=Новый Структура;
	ПараметрыОповещения.Вставить("ИдентификаторСтроки", Элементы.НаборыДанныхПоля.ТекущаяСтрока);
	ПараметрыОповещения.Вставить("ИдентификаторСтрокиНабора", Элементы.НаборыДанных.ТекущаяСтрока);

	ОткрытьФорму("Обработка.УИ_РедакторСКД.Форма.ФормаРедактированияРолиПоляНабораДанных", ПараметрыФормы, ЭтотОбъект, ,
		, , Новый ОписаниеОповещения("НаборыДанныхПоляРольПредставлениеНачалоВыбораЗавершение", ЭтотОбъект,
		ПараметрыОповещения), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ПоляДоступныеЗначенияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные=Элементы.НаборыДанныхПоля.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтандартнаяОбработка=Ложь;

	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ИдентификаторСтроки", ТекДанные.ПолучитьИдентификатор());
	ДопПараметры.Вставить("ИдентификаторСтрокиНабора", Элементы.НаборыДанных.ТекущаяСтрока);

	УИ_ОбщегоНазначенияКлиент.ОткрытьФормуВыбораЭлементовСпискаЗначений(ТекДанные.ДоступныеЗначения,
		Новый ОписаниеОповещения("ПоляДоступныеЗначенияНачалоВыбораЗавершение", ЭтотОбъект, ДопПараметры),
		"Редактирование списка значений", ТекДанные.ТипЗначения, Ложь, Истина, Истина, Ложь,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхПоляПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если Не Копирование Тогда
		Возврат;
	КонецЕсли;

	ТекСтрока=Элементы.НаборыДанныхПоля.ТекущиеДанные;
	Если ТекСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТекСтрокаНабора=Элементы.НаборыДанных.ТекущиеДанные;

	ЧислоВКонце=УИ_СтроковыеФункцииКлиентСервер.ЧислоВКонцеСтроки(ТекСтрока.ПутьКДанным);

	Если ЧислоВКонце = Неопределено Тогда
		ТекСтрока.ПутьКДанным=ТекСтрока.ПутьКДанным + ТекСтрока.ПолучитьИдентификатор();
	Иначе
		Суффикс=Формат(ЧислоВКонце, "ЧГ=0;");
		НовыйПутьКДанным=ТекСтрока.ПутьКДанным;
		УИ_СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(НовыйПутьКДанным, СтрДлина(Суффикс));

		ПутьКДанным=НовыйПутьКДанным + Формат(ЧислоВКонце + 1, "ЧГ=0;");
		СтруктураПоиска=Новый Структура;
		СтруктураПоиска.Вставить("ПутьКДанным", ПутьКДанным);

		НайденныеСтроки=ТекСтрокаНабора.Поля.НайтиСтроки(СтруктураПоиска);
		Пока НайденныеСтроки.Количество() > 0 Цикл
			ЧислоВКонце=ЧислоВКонце + 1;
			ПутьКДанным=НовыйПутьКДанным + Формат(ЧислоВКонце + 1, "ЧГ=0;");

			СтруктураПоиска=Новый Структура;
			СтруктураПоиска.Вставить("ПутьКДанным", ПутьКДанным);
			НайденныеСтроки=ТекСтрокаНабора.Поля.НайтиСтроки(СтруктураПоиска);

		КонецЦикла;

		ТекСтрока.ПутьКДанным=ПутьКДанным;
	КонецЕсли;

	ТекСтрока.Заголовок=УИ_СтроковыеФункцииКлиентСервер.ПредставлениеИдентификатора(ТекСтрока.ПутьКДанным);
	Если ТекСтрока.Вид <> ВидыПолейНаборовДанных.Папка Тогда
		ТекСтрока.Поле=ТекСтрока.ПутьКДанным;
	КонецЕсли;

	УстановитьДоступностьКнопокДобавленияПолейНабора();
КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхАвтоЗаполнениеДоступныхПолейПриИзменении(Элемент)
	УстановитьДоступностьКнопокДобавленияПолейНабора();
	ЗаполнитьПоляНабораДанныхПриИзмененииЗапросаНаСервере(Элементы.НаборыДанных.ТекущаяСтрока);
КонецПроцедуры
&НаКлиенте
Процедура НаборыДанныхПоляПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр)
	Если Не Копирование Тогда
		Отказ=Истина;
	Иначе
		Отказ=Не ДоступноКопированиеУдаленияПоляНабора(Элементы.НаборыДанных.ТекущиеДанные,
			Элементы.НаборыДанныхПоля.ТекущиеДанные);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхПоляПередУдалением(Элемент, Отказ)
	Отказ=Не ДоступноКопированиеУдаленияПоляНабора(Элементы.НаборыДанных.ТекущиеДанные,
		Элементы.НаборыДанныхПоля.ТекущиеДанные);
КонецПроцедуры

&НаКлиенте
Процедура ПоляПутьКДаннымПриИзменении(Элемент)
	ТекДанные=Элементы.НаборыДанныхПоля.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекДанные.Заголовок=УИ_СтроковыеФункцииКлиентСервер.ПредставлениеИдентификатора(ТекДанные.ПутьКДанным);
КонецПроцедуры

&НаКлиенте
Процедура НаборыДанныхПоляПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	Если ОтменаРедактирования Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаНабора=Элементы.НаборыДанных.ТекущаяСтрока;
	ДанныеСтрокиНабора=НаборыДанных.НайтиПоИдентификатору(СтрокаНабора);
	РодительСтрокиНабора=ДанныеСтрокиНабора.ПолучитьРодителя();
	Если РодительСтрокиНабора.Вид=ВидыНаборовДанных.Объединение Тогда
		ЗаполнитьПоляНабораДанныхОбъединениеПоПодчиненнымЗапросам(РодительСтрокиНабора.ПолучитьИдентификатор());
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПоляТипЗначенияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные=Элементы.НаборыДанныхПоля.ТекущиеДанные;
	Если ТекДанные=Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УИ_ОбщегоНазначенияКлиент.РедактироватьТип(ТекДанные.ТипЗначения, 2,СтандартнаяОбработка,ЭтотОбъект, Новый ОписаниеОповещения("ПоляТипЗначенияНачалоВыбораЗавершение",ЭтотОбъект, Новый Структура("ТекСтрока",Элементы.НаборыДанныхПоля.ТекущаяСтрока)));
КонецПроцедуры

&НаКлиенте
Процедура ПоляВыражениеПредставленияОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	ТекДанные=Элементы.НаборыДанныхПоля.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ИдентификаторСтроки", ТекДанные.ПолучитьИдентификатор());

	ОткрытьФормуРедактированияВыражения(ТекДанные.ВыражениеПредставления,
		Новый ОписаниеОповещения("ПоляВыражениеПредставленияОткрытиеЗавершение", ЭтотОбъект, ДопПараметры), Ложь,
		"Редактирование выражения ресурса для " + ТекДанные.ПутьКДанным);
КонецПроцедуры

#КонецОбласти

#Область СвязиНаборовДанных

&НаКлиенте
Процедура СвязиНаборовДанныхНаборДанныхИсточникПриИзменении(Элемент)
	ТекДанные=Элементы.СвязиНаборовДанных.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ЗаполнитьСписокВыбораПоляСвязиНаборов(ТекДанные.НаборДанныхИсточник, Элементы.СвязиНаборовДанныхВыражениеИсточник);
КонецПроцедуры

&НаКлиенте
Процедура СвязиНаборовДанныхНаборДанныхПриемникПриИзменении(Элемент)
	ТекДанные=Элементы.СвязиНаборовДанных.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ЗаполнитьСписокВыбораПоляСвязиНаборов(ТекДанные.НаборДанныхПриемник, Элементы.СвязиНаборовДанныхВыражениеПриемник);
КонецПроцедуры

&НаКлиенте
Процедура СвязиНаборовДанныхПередНачаломИзменения(Элемент, Отказ)
	ТекДанные=Элементы.СвязиНаборовДанных.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ЗаполнитьСписокВыбораПоляСвязиНаборов(ТекДанные.НаборДанныхИсточник, Элементы.СвязиНаборовДанныхВыражениеИсточник);
	ЗаполнитьСписокВыбораПоляСвязиНаборов(ТекДанные.НаборДанныхПриемник, Элементы.СвязиНаборовДанныхВыражениеПриемник);

КонецПроцедуры
#КонецОбласти

#Область Ресурсы
&НаКлиенте
Процедура ДоступныеПоляРесурсовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;

	ДобавитьРесурс(ВыбраннаяСтрока);
КонецПроцедуры

&НаКлиенте
Процедура РесурсыПередНачаломИзменения(Элемент, Отказ)
	ЗаполнитьСписокВыбораВыраженияРесурса(Элемент.ТекущаяСтрока);
КонецПроцедуры

&НаКлиенте
Процедура РесурсыВыражениеОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	ТекДанные=Элементы.Ресурсы.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ИдентификаторСтроки", Элементы.Ресурсы.ТекущаяСтрока);

	ОткрытьФормуРедактированияВыражения(ТекДанные.Выражение,
		Новый ОписаниеОповещения("РесурсыВыражениеОткрытиеЗавершение", ЭтотОбъект, ДопПараметры), Истина,
		"Редактирование выражения ресурса для " + ТекДанные.ПутьКДанным);
КонецПроцедуры

&НаКлиенте
Процедура РесурсыГруппировкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	ТекДанные=Элементы.Ресурсы.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СписокДоступныхГруппировок=Новый СписокЗначений;
	Для Каждого Стр Из ДоступныеПоляРесурсов Цикл
		Пометка= ТекДанные.Группировки.НайтиПоЗначению(Стр.ПутьКДанным) <> Неопределено;
		СписокДоступныхГруппировок.Добавить(Стр.ПутьКДанным, , Пометка);
	КонецЦикла;

	Пометка= ТекДанные.Группировки.НайтиПоЗначению("ОбщийИтог") <> Неопределено;

	СписокДоступныхГруппировок.Добавить("ОбщийИтог", "Общий итог", Пометка);

	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ИдентификаторСтроки", Элементы.Ресурсы.ТекущаяСтрока);

	УИ_ОбщегоНазначенияКлиент.ОткрытьФормуВыбораЭлементовСпискаЗначений(СписокДоступныхГруппировок,
		Новый ОписаниеОповещения("РесурсыГруппировкиНачалоВыбораЗавершение", ЭтотОбъект, ДопПараметры),
		"Поля группировки", , Истина, Ложь, Ложь, , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

#КонецОбласти

#Область ВычисляемыеПоля
&НаКлиенте
Процедура ВычисляемыеПоляПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	ЗаполнитьВспомогательныеДанныеРесурсов();
КонецПроцедуры

&НаКлиенте
Процедура ВычисляемыеПоляПослеУдаления(Элемент)
	ЗаполнитьВспомогательныеДанныеРесурсов();
КонецПроцедуры
&НаКлиенте
Процедура ВычисляемыеПоляПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	ТекДанные=Элементы.ВычисляемыеПоля.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если НоваяСтрока Тогда
		ТекДанные.ПутьКДанным="Поле" + ТекДанные.ПолучитьИдентификатор();
		ТекДанные.Заголовок=ТекДанные.ПутьКДанным;
	КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВычисляемыеПоляВыражениеОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	ТекДанные=Элементы.ВычисляемыеПоля.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ИдентификаторСтроки", Элементы.ВычисляемыеПоля.ТекущаяСтрока);

	ОткрытьФормуРедактированияВыражения(ТекДанные.Выражение,
		Новый ОписаниеОповещения("ВычисляемыеПоляВыражениеЗавершение", ЭтотОбъект, ДопПараметры), Ложь,
		"Редактирование выражения ресурса для " + ТекДанные.ПутьКДанным);
КонецПроцедуры
&НаКлиенте
Процедура ВычисляемыеПоляДоступныеЗначенияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные=Элементы.ВычисляемыеПоля.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтандартнаяОбработка=Ложь;

	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ИдентификаторСтроки", ТекДанные.ПолучитьИдентификатор());

	УИ_ОбщегоНазначенияКлиент.ОткрытьФормуВыбораЭлементовСпискаЗначений(ТекДанные.ДоступныеЗначения,
		Новый ОписаниеОповещения("ВычисляемыеПоляДоступныеЗначенияНачалоВыбораЗавершение", ЭтотОбъект, ДопПараметры),
		"Редактирование списка значений", ТекДанные.ТипЗначения, Ложь, Истина, Истина, Ложь,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ВычисляемыеПоляПутьКДаннымПриИзменении(Элемент)
	ТекДанные=Элементы.ВычисляемыеПоля.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТекДанные.Заголовок=УИ_СтроковыеФункцииКлиентСервер.ПредставлениеИдентификатора(ТекДанные.ПутьКДанным);
КонецПроцедуры

&НаКлиенте
Процедура ВычисляемыеПоляТипЗначенияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные=Элементы.ВычисляемыеПоля.ТекущиеДанные;
	Если ТекДанные=Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УИ_ОбщегоНазначенияКлиент.РедактироватьТип(ТекДанные.ТипЗначения, 2,СтандартнаяОбработка,ЭтотОбъект, Новый ОписаниеОповещения("ВычисляемыеПоляТипЗначенияНачалоВыбораЗавершение",ЭтотОбъект, Новый Структура("ТекСтрока",Элементы.ВычисляемыеПоля.ТекущаяСтрока)));
КонецПроцедуры


#КонецОбласти

#Область Параметры

&НаКлиенте
Процедура ПараметрыСКДПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	ТекДанные=Элементы.ПараметрыСКД.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если НоваяСтрока Тогда
		ТекДанные.Имя="Параметр" + ТекДанные.ПолучитьИдентификатор();
		ТекДанные.Заголовок=ТекДанные.Имя;
		ТекДанные.ВключатьВДоступныеПоля=Истина;
		ТекДанные.ДобавленАвтоматически=Ложь;
	КонецЕсли;

	УстановитьСписокВыбораПоляЗначенияПараметра(ТекДанные);
	УстановитьОграничениеТипаПоляЗначенияПараметра(ТекДанные);
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыСКДТипЗначенияПриИзменении(Элемент)
	ТекДанные=Элементы.ПараметрыСКД.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ТекДанные.ДоступенСписокЗначений Тогда
		НовоеЗначение=Новый СписокЗначений;

		Для Каждого ЭлементСписка Из ТекДанные.Значение Цикл
			Если ТекДанные.ТипЗначения.СодержитТип(ТипЗнч(ЭлементСписка.Значение)) Тогда
				НовоеЗначение.Добавить(ЭлементСписка.Значение);
			КонецЕсли;
		КонецЦикла;
		ТекДанные.Значение=НовоеЗначение;
	Иначе
		ТекДанные.Значение=ТекДанные.ТипЗначения.ПривестиЗначение(ТекДанные.Значение);
	КонецЕсли;

	УстановитьОграничениеТипаПоляЗначенияПараметра(ТекДанные);
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыСКДДоступныеЗначенияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;

	ТекДанные=Элементы.ПараметрыСКД.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ТекДанные.ТипЗначения = Новый ОписаниеТипов Тогда
		Возврат;
	КонецЕсли;

	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ИдентификаторСтроки", ТекДанные.ПолучитьИдентификатор());

	УИ_ОбщегоНазначенияКлиент.ОткрытьФормуВыбораЭлементовСпискаЗначений(ТекДанные.ДоступныеЗначения,
		Новый ОписаниеОповещения("ПараметрыСКДДоступныеЗначенияНачалоВыбораЗавершение", ЭтотОбъект, ДопПараметры),
		"Редактирование списка значений", ТекДанные.ТипЗначения, Ложь, Истина, Истина, Ложь,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыСКДЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные=Элементы.ПараметрыСКД.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ТекДанные.ТипЗначения = Новый ОписаниеТипов Тогда
		Возврат;
	КонецЕсли;

	Если Не ТекДанные.ДоступенСписокЗначений Тогда
		Возврат;
	КонецЕсли;

	СтандартнаяОбработка=Ложь;

	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ИдентификаторСтроки", ТекДанные.ПолучитьИдентификатор());

	ДоступныеЗначения=Неопределено;
	Если ТекДанные.ДоступныеЗначения.Количество() > 0 Тогда
		ДоступныеЗначения=ТекДанные.ДоступныеЗначения;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.ОткрытьФормуВыбораЭлементовСпискаЗначений(ТекДанные.Значение,
		Новый ОписаниеОповещения("ПараметрыСКДЗначениеНачалоВыбораЗавершение", ЭтотОбъект, ДопПараметры),
		"Редактирование списка значений", ТекДанные.ТипЗначения, Ложь, Ложь, Истина, Ложь,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца, ДоступныеЗначения);

КонецПроцедуры
&НаКлиенте
Процедура ПараметрыСКДДоступенСписокЗначенийПриИзменении(Элемент)
	ТекДанные=Элементы.ПараметрыСКД.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ТекДанные.ДоступенСписокЗначений Тогда
		НовоеЗначение=Новый СписокЗначений;
		НовоеЗначение.Добавить(ТекДанные.Значение);
	Иначе
		Если ТекДанные.Значение.Количество() = 0 Тогда
			НовоеЗначение=Неопределено;
		Иначе
			НовоеЗначение=ТекДанные.Значение[0].Значение;
		КонецЕсли;
	КонецЕсли;

	ТекДанные.Значение=НовоеЗначение;

	УстановитьОграничениеТипаПоляЗначенияПараметра(ТекДанные);
КонецПроцедуры
&НаКлиенте
Процедура ПараметрыСКДВыражениеОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	ТекДанные=Элементы.ПараметрыСКД.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ИдентификаторСтроки", Элементы.ПараметрыСКД.ТекущаяСтрока);

	ОткрытьФормуРедактированияВыражения(ТекДанные.Выражение,
		Новый ОписаниеОповещения("ПараметрыСКДВыражениеОткрытиеЗавершение", ЭтотОбъект, ДопПараметры), Истина,
		"Редактирование выражения для " + ТекДанные.Имя);
КонецПроцедуры


&НаКлиенте
Процедура ПараметрыСКДИмяПриИзменении(Элемент)
	ТекДанные=Элементы.ПараметрыСКД.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТекДанные.Заголовок=УИ_СтроковыеФункцииКлиентСервер.ПредставлениеИдентификатора(ТекДанные.Имя);
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыСКДПередУдалением(Элемент, Отказ)
	ТекДанные=Элементы.ПараметрыСКД.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Отказ=ТекДанные.ДобавленАвтоматически;
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыСКДТипЗначенияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные=Элементы.ПараметрыСКД.ТекущиеДанные;
	Если ТекДанные=Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УИ_ОбщегоНазначенияКлиент.РедактироватьТип(ТекДанные.ТипЗначения, 3,СтандартнаяОбработка,ЭтотОбъект, Новый ОписаниеОповещения("ПараметрыСКДТипЗначенияНачалоВыбораЗавершение",ЭтотОбъект, Новый Структура("ТекСтрока",Элементы.ПараметрыСКД.ТекущаяСтрока)));
КонецПроцедуры
#КонецОбласти

#Область ТекущиеНастройкиВарианта

&НаКлиенте
Процедура КомпоновщикНастроекНастройкиПриАктивизацииПоля(Элемент)

	Перем ВыбраннаяСтраница;

	Если Элементы.КомпоновщикНастроекНастройки.ТекущийЭлемент.Имя = "КомпоновщикНастроекНастройкиНаличиеВыбора" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаПолейВыбора;

	ИначеЕсли Элементы.КомпоновщикНастроекНастройки.ТекущийЭлемент.Имя = "КомпоновщикНастроекНастройкиНаличиеОтбора" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаОтбора;

	ИначеЕсли Элементы.КомпоновщикНастроекНастройки.ТекущийЭлемент.Имя = "КомпоновщикНастроекНастройкиНаличиеПорядка" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаПорядка;

	ИначеЕсли Элементы.КомпоновщикНастроекНастройки.ТекущийЭлемент.Имя
		= "КомпоновщикНастроекНастройкиНаличиеУсловногоОформления" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаУсловногоОформления;

	ИначеЕсли Элементы.КомпоновщикНастроекНастройки.ТекущийЭлемент.Имя
		= "КомпоновщикНастроекНастройкиНаличиеПараметровВывода" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаПараметровВывода;

	КонецЕсли;

	Если ВыбраннаяСтраница <> Неопределено Тогда

		Элементы.СтраницыНастроек.ТекущаяСтраница = ВыбраннаяСтраница;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомпоновщикНастроекНастройкиПриАктивизацииСтроки(Элемент)

	ЭлементСтруктуры = КомпоновщикТекущихНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
		Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока);
	ТипЭлемента = ТипЗнч(ЭлементСтруктуры);

	Если ТипЭлемента = Неопределено Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных")
		Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Тогда

		ПоляГруппировкиНедоступны();
		ВыбранныеПоляНедоступны();
		ОтборНедоступен();
		ПорядокНедоступен();
		УсловноеОформлениеНедоступно();
		ПараметрыВыводаНедоступны();

	ИначеЕсли ТипЭлемента = Тип("НастройкиКомпоновкиДанных") Или ТипЭлемента = Тип(
		"НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда

		ПоляГруппировкиНедоступны();

		ЛокальныеВыбранныеПоля = Истина;
		Элементы.ЛокальныеВыбранныеПоля.ТолькоПросмотр = Истина;
		Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.НастройкиВыбранныхПолей;

		ЛокальныйОтбор = Истина;
		Элементы.ЛокальныйОтбор.ТолькоПросмотр = Истина;
		Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.НастройкиОтбора;

		ЛокальныйПорядок = Истина;
		Элементы.ЛокальныйПорядок.ТолькоПросмотр = Истина;
		Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.НастройкиПорядка;

		ЛокальноеУсловноеОформление = Истина;
		Элементы.ЛокальноеУсловноеОформление.ТолькоПросмотр = Истина;
		Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.НастройкиУсловногоОформления;

		ЛокальныеПараметрыВывода = Истина;
		Элементы.ЛокальныеПараметрыВывода.ТолькоПросмотр = Истина;
		Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.НастройкиПараметровВывода;

	ИначеЕсли ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных") Или ТипЭлемента = Тип(
		"ГруппировкаТаблицыКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда

		Элементы.СтраницыПолейГруппировки.ТекущаяСтраница = Элементы.НастройкиПолейГруппировки;

		ВыбранныеПоляДоступны(ЭлементСтруктуры);
		ОтборДоступен(ЭлементСтруктуры);
		ПорядокДоступен(ЭлементСтруктуры);
		УсловноеОформлениеДоступно(ЭлементСтруктуры);
		ПараметрыВыводаДоступны(ЭлементСтруктуры);

	ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Или ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных") Тогда

		ПоляГруппировкиНедоступны();
		ВыбранныеПоляДоступны(ЭлементСтруктуры);
		ОтборНедоступен();
		ПорядокНедоступен();
		УсловноеОформлениеДоступно(ЭлементСтруктуры);
		ПараметрыВыводаДоступны(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПерейтиКОтчету(Элемент)

	ЭлементСтруктуры = КомпоновщикТекущихНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
		Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока);
	НастройкиЭлемента =  КомпоновщикТекущихНастроек.Настройки.НастройкиЭлемента(ЭлементСтруктуры);
	Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока = КомпоновщикТекущихНастроек.Настройки.ПолучитьИдентификаторПоОбъекту(
		НастройкиЭлемента);

КонецПроцедуры

&НаКлиенте
Процедура ЛокальныеВыбранныеПоляПриИзменении(Элемент)

	Если ЛокальныеВыбранныеПоля Тогда

		Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.НастройкиВыбранныхПолей;

	Иначе

		Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.ОтключенныеНастройкиВыбранныхПолей;

		ЭлементСтруктуры = КомпоновщикТекущихНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока);
		КомпоновщикТекущихНастроек.Настройки.ОчиститьВыборЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЛокальныйОтборПриИзменении(Элемент)

	Если ЛокальныйОтбор Тогда

		Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.НастройкиОтбора;

	Иначе

		Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.ОтключенныеНастройкиОтбора;

		ЭлементСтруктуры = КомпоновщикТекущихНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока);
		КомпоновщикТекущихНастроек.Настройки.ОчиститьОтборЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЛокальныйПорядокПриИзменении(Элемент)

	Если ЛокальныйПорядок Тогда

		Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.НастройкиПорядка;

	Иначе

		Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПорядка;

		ЭлементСтруктуры = КомпоновщикТекущихНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока);
		КомпоновщикТекущихНастроек.Настройки.ОчиститьПорядокЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЛокальноеУсловноеОформлениеПриИзменении(Элемент)

	Если ЛокальноеУсловноеОформление Тогда

		Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.НастройкиУсловногоОформления;

	Иначе

		Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.ОтключенныеНастройкиУсловногоОформления;

		ЭлементСтруктуры = КомпоновщикТекущихНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока);
		КомпоновщикТекущихНастроек.Настройки.ОчиститьУсловноеОформлениеЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЛокальныеПараметрыВыводаПриИзменении(Элемент)

	Если ЛокальныеПараметрыВывода Тогда

		Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.НастройкиПараметровВывода;

	Иначе

		Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПараметровВывода;

		ЭлементСтруктуры = КомпоновщикТекущихНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока);
		КомпоновщикТекущихНастроек.Настройки.ОчиститьПараметрыВыводаЭлемента(ЭлементСтруктуры);
	КонецЕсли;

КонецПроцедуры
#КонецОбласти

#Область ВариантыНастроек

&НаКлиенте
Процедура ВариантыНастроекПриАктивизацииСтроки(Элемент)
	ВариантыНастроекПриАктивизацииСтрокиНаСервере(Элементы.ВариантыНастроек.ТекущаяСтрока);
КонецПроцедуры

&НаКлиенте
Процедура ВариантыНастроекПередУдалением(Элемент, Отказ)
	Если ВариантыНастроек.Количество() = 1 Тогда
		Отказ=Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВариантыНастроекПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

	Если Не НоваяСтрока Тогда
		Возврат;
	КонецЕсли;
	ТекДанные=Элементы.ВариантыНастроек.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТекДанные.Имя="Вариант" + ТекДанные.ПолучитьИдентификатор();
	ТекДанные.Представление=ТекДанные.Имя;
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ДобавитьНаборДанныхЗапрос(Команда)
	ДобавитьНаборДанных(ВидыНаборовДанных.Запрос);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьНаборДанныхОбъект(Команда)
	ДобавитьНаборДанных(ВидыНаборовДанных.Объект);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьНаборДанныхОбъединение(Команда)
	ДобавитьНаборДанных(ВидыНаборовДанных.Объединение);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьНаборДанных(Команда)
	ИдентификаторТекущейСтроки=Элементы.НаборыДанных.ТекущаяСтрока;
	Если ИдентификаторТекущейСтроки = ИдентификаторНулевогоНабораДанных Тогда
		Возврат;
	КонецЕсли;

	СтрокаНабораДанных=НаборыДанных.НайтиПоИдентификатору(ИдентификаторТекущейСтроки);

	ИмяНабораДанных=СтрокаНабораДанных.Имя;

	СтрокаРодитель=СтрокаНабораДанных.ПолучитьРодителя();
	СтрокаРодитель.ПолучитьЭлементы().Удалить(СтрокаНабораДанных);
	
	//Удалим связи этого набора
	МассивКУдалению=Новый Массив;
	Для Каждого Стр Из СвязиНаборовДанных Цикл
		Если НРег(Стр.НаборДанныхИсточник) = НРег(ИмяНабораДанных) Или НРег(Стр.НаборДанныхПриемник) = НРег(
			ИмяНабораДанных) Тогда

			МассивКУдалению.Добавить(Стр);
		КонецЕсли;

	КонецЦикла;

	Для Каждого Стр Из МассивКУдалению Цикл
		СвязиНаборовДанных.Удалить(Стр);
	КонецЦикла;
	
	УдалитьПараметрыЗапроса(ПараметрыЗапросов, ПараметрыСКД, ИдентификаторТекущейСтроки);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьКонструкторЗапроса(Команда)
	ТекНабор=Элементы.НаборыДанных.ТекущиеДанные;
	Если ТекНабор = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СохранитьТекстЗапросаВТекущийНабор();

	Конструктор=Новый КонструкторЗапроса;
	Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше_8_3_14() Тогда
		Конструктор.РежимКомпоновкиДанных=Истина;
	КонецЕсли;

	Если ЗначениеЗаполнено(СокрЛП(ТекНабор.Запрос)) Тогда
		Конструктор.Текст=ТекНабор.Запрос;
	КонецЕсли;

	ДопПараметрыОповещения=Новый Структура;
	ДопПараметрыОповещения.Вставить("ТекСтрока", Элементы.НаборыДанных.ТекущаяСтрока);

	Конструктор.Показать(Новый ОписаниеОповещения("ОткрытьКонструкторЗапросаЗавершение", ЭтотОбъект,
		ДопПараметрыОповещения));
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРесурсИзДоступных(Команда)
	ТекДанные=Элементы.ДоступныеПоляРесурсов.ТекущаяСтрока;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДобавитьРесурс(ТекДанные);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьЧисловыеРесурсыИзДоступных(Команда)
	Для Каждого Стр Из ДоступныеПоляРесурсов Цикл
		Если Не Стр.ВычисляемоеПоле И Не Стр.Числовое Тогда
			Продолжить;
		КонецЕсли;

		ДобавитьРесурс(Стр);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРесурс(Команда)
	ТекСтрокаРесурсов=Элементы.Ресурсы.ТекущаяСтрока;
	Если ТекСтрокаРесурсов = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Ресурсы.Удалить(Ресурсы.НайтиПоИдентификатору(ТекСтрокаРесурсов));
КонецПроцедуры

&НаКлиенте
Процедура УдалитьВсеРесурсы(Команда)
	Ресурсы.Очистить();
КонецПроцедуры

&НаКлиенте
Процедура СохранитьСхемуВФайл(Команда)
	УИ_ОбщегоНазначенияКлиент.ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(
		Новый ОписаниеОповещения("СохранитьСхемуВФайлЗавершение", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ПрочитатьСхемуИзФайла(Команда)
	УИ_ОбщегоНазначенияКлиент.ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(
		Новый ОписаниеОповещения("ПрочитатьСхемуИзФайлаЗавершение", ЭтотОбъект));
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьРедактирование(Команда)
	СобратьСКДПоДаннымФормы(Истина);

	Закрыть(АдресСхемыКомпоновкиДанных);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьПолеНабораПапка(Команда)
	ВручнуюДобавитьПолеНабораДанных(ВидыПолейНаборовДанных.Папка);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьПолеНабораПоле(Команда)
	ВручнуюДобавитьПолеНабораДанных(ВидыПолейНаборовДанных.Поле);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьПолеНабораНабор(Команда)
	ВручнуюДобавитьПолеНабораДанных(ВидыПолейНаборовДанных.Набор);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры



#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ЧтениеСохранениеВФайл
&НаКлиенте
Процедура СохранитьСхемуВФайлЗавершение(Результат, ДополнительныеПараметры) Экспорт
	ДВФ=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДВФ.Расширение="xml";
	ДВФ.Фильтр="Файл XML(*.xml)|*.xml";
	ДВФ.МножественныйВыбор=Ложь;
	ДВФ.Показать(Новый ОписаниеОповещения("СохранитьСхемуВФайлЗавершениеВыбораИмениФайла", ЭтотОбъект));
КонецПроцедуры

&НаКлиенте
Процедура СохранитьСхемуВФайлЗавершениеВыбораИмениФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ВыбранныеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	АдресТекста=ПодготовитьСКДДляСохраненияВФайл();

	Текст=Новый ТекстовыйДокумент;
	Текст.УстановитьТекст(ПолучитьИзВременногоХранилища(АдресТекста));
	Текст.НачатьЗапись(Новый ОписаниеОповещения("СохранитьСхемуВФайлЗавершениеСохранения", ЭтотОбъект),
					   ВыбранныеФайлы[0],
					   "utf-8");
КонецПроцедуры

&НаКлиенте
Процедура СохранитьСхемуВФайлЗавершениеСохранения(Результат, ДополнительныеПараметры) Экспорт
	Если Результат <> Истина Тогда
		Возврат;
	КонецЕсли;
		
	УИ_РедакторКодаКлиент.УстановитьОригинальныйТекстРедактораРавнымТекущему(ЭтотОбъект, "Запрос");
КонецПроцедуры

&НаСервере
Функция ПодготовитьСКДДляСохраненияВФайл()
	СохранитьВТаблицуФормыНастройкуТекущегоВариантаНастроек();
	СобратьСКДПоДаннымФормы(Истина);

	ТекстСКД=УИ_ОбщегоНазначения.ЗначениеВСтрокуXML(ПолучитьИзВременногоХранилища(АдресСхемыКомпоновкиДанных));

	Возврат ПоместитьВоВременноеХранилище(ТекстСКД, УникальныйИдентификатор);
КонецФункции

&НаКлиенте
Процедура ПрочитатьСхемуИзФайлаЗавершение(Результат, ДополнительныеПараметры) Экспорт
	ДВФ=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДВФ.Расширение="xml";
	ДВФ.Фильтр="Файл XML(*.xml)|*.xml";
	ДВФ.МножественныйВыбор=Ложь;

	НачатьПомещениеФайла(Новый ОписаниеОповещения("ПрочитатьСхемуИзФайлаЗавершениеПомещенияФайла", ЭтотОбъект), , ДВФ,
		Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьСхемуИзФайлаЗавершениеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	Если Не Результат Тогда
		Возврат;
	КонецЕсли;

	ПрочитатьСхемуИзФайлаНаСервере(Адрес);
	ЗаполнитьВспомогательныеДанныеРесурсов();
КонецПроцедуры

&НаСервере
Процедура ПрочитатьСхемуИзФайлаНаСервере(АдресФайла)

	ДД=ПолучитьИзВременногоХранилища(АдресФайла);

	Текст=Новый ТекстовыйДокумент;
	Текст.Прочитать(ДД.ОткрытьПотокДляЧтения());

	Попытка
		СКД=УИ_ОбщегоНазначения.ЗначениеИзСтрокиXML(Текст.ПолучитьТекст());
	Исключение
		Сообщить(СтрШаблон("Не удалось прочитать СКД из файла: %1", ОписаниеОшибки()));
		Возврат;
	КонецПопытки;

	ПрочитатьСКДВДанныеФормы(СКД);
КонецПроцедуры

#КонецОбласти

#Область НаборыДанных
&НаКлиенте
Функция НаборДанныхПоИмени(ИмяНабора, СтрокаНаборов = Неопределено)
	Если СтрокаНаборов = Неопределено Тогда
		СтрокаПоискаНаборов=НаборыДанных.НайтиПоИдентификатору(ИдентификаторНулевогоНабораДанных);
	Иначе
		СтрокаПоискаНаборов=СтрокаНаборов;
	КонецЕсли;

	НайденныйНабор=Неопределено;
	Для Каждого Стр Из СтрокаПоискаНаборов.ПолучитьЭлементы() Цикл
		Если НРег(Стр.Имя) = НРег(ИмяНабора) Тогда
			НайденныйНабор=Стр;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Возврат НайденныйНабор;
КонецФункции

&НаКлиенте
Процедура ЗаполнитьПоляНабораДанныхПриИзмененииЗапроса(ИдентификаторСтрокиНабора)
	Если Не ЗапросНабораКорректен(ИдентификаторСтрокиНабора) Тогда
		Возврат;
	КонецЕсли;
	
	ЗаполнитьПоляНабораДанныхПриИзмененииЗапросаНаСервере(ИдентификаторСтрокиНабора);
	ЗаполнитьПараметрыСКДПриИзмененииЗапросаНабора(ИдентификаторСтрокиНабора);
	ЗаполнитьВспомогательныеДанныеРесурсов();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПараметрыСКДПриИзмененииЗапросаНабора(ИдентификаторСтрокиНабора)
	
	СтрокаНабора=НаборыДанных.НайтиПоИдентификатору(ИдентификаторСтрокиНабора);
	
	УдалитьПараметрыЗапроса(ПараметрыЗапросов, ПараметрыСКД, ИдентификаторСтрокиНабора);
	
	Если Не ЗначениеЗаполнено(СтрокаНабора.Запрос) Тогда
		Возврат;
	КонецЕсли;

	ДобавитьПараметрыЗапроса(ПараметрыЗапросов, ПараметрыСКД, ИдентификаторСтрокиНабора, СтрокаНабора.Запрос)
	
КонецПроцедуры

// Удалить параметры запроса.
// 
// Параметры:
//  ПараметрыЗапросов - ДанныеФормыКоллекция - Параметры запросов
//  ПараметрыСКД - ДанныеФормыКоллекция - Параметры СКД
//  ИдентификаторЗапроса - Число - Идентификатор запроса
&НаКлиентеНаСервереБезКонтекста
Процедура УдалитьПараметрыЗапроса(ПараметрыЗапросов, ПараметрыСКД, ИдентификаторЗапроса)
	
	ПараметрыОтбораПоИдентификатору = Новый Структура;
	ПараметрыОтбораПоИдентификатору.Вставить("ИдентификаторЗапроса", ИдентификаторЗапроса);
	
	НайденныеПараметры = ПараметрыЗапросов.НайтиСтроки(ПараметрыОтбораПоИдентификатору);
	
	ПараметрыОтбораПоИмени = Новый Структура("Имя");
	
	Для Каждого Параметр Из НайденныеПараметры Цикл
		ПараметрыЗапросов.Удалить(Параметр);
		
		ПараметрыОтбораПоИмени.Имя = Параметр.Имя;
		ПараметрыДругихЗапросов = ПараметрыЗапросов.НайтиСтроки(ПараметрыОтбораПоИмени);
		НайденныеПараметрыСКД = ПараметрыСКД.НайтиСтроки(ПараметрыОтбораПоИмени);
		
		Для Каждого ПараметрСКД Из НайденныеПараметрыСКД Цикл
			Если ПараметрыДругихЗапросов.Количество() = 0 Тогда
				ПараметрыСКД.Удалить(ПараметрСКД);
			Иначе
				ЗаполнитьТипПараметраСКД(ПараметрСКД, ПараметрыЗапросов);
			КонецЕсли;
		КонецЦикла;
		
	КонецЦикла;
		
КонецПроцедуры

// Добавить параметры запроса.
// 
// Параметры:
//  ПараметрыЗапросов - ДанныеФормыКоллекция - Параметры запросов
//  ПараметрыСКД - ДанныеФормыКоллекция - Параметры СКД
//  ИдентификаторЗапроса - Число - Идентификатор запроса
//  ТекстЗапроса - Строка - Текст запроса
&НаСервереБезКонтекста
Процедура ДобавитьПараметрыЗапроса(ПараметрыЗапросов, ПараметрыСКД, ИдентификаторЗапроса, ТекстЗапроса)
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	ПараметрыЗапроса = Запрос.НайтиПараметры();
	
	Для Каждого ОписаниеПараметра Из ПараметрыЗапроса Цикл
		
		СтрокаПараметровЗапросов = ПараметрыЗапросов.Добавить();
		СтрокаПараметровЗапросов.ИдентификаторЗапроса = ИдентификаторЗапроса;
		СтрокаПараметровЗапросов.Имя = ОписаниеПараметра.Имя;
		СтрокаПараметровЗапросов.ТипЗначения = ОписаниеПараметра.ТипЗначения;
		
		СтруктураПоиска = Новый Структура;
		СтруктураПоиска.Вставить("Имя", ОписаниеПараметра.Имя);

		НайденныеСтрокиПараметров = ПараметрыСКД.НайтиСтроки(СтруктураПоиска);
		Если НайденныеСтрокиПараметров.Количество() = 0 Тогда
			СтрокаПараметра = ПараметрыСКД.Добавить();
			СтрокаПараметра.Имя = ОписаниеПараметра.Имя;
			СтрокаПараметра.Заголовок = ОписаниеПараметра.Имя;
			СтрокаПараметра.ВключатьВДоступныеПоля = Истина;
		Иначе
			СтрокаПараметра = НайденныеСтрокиПараметров[0];
		КонецЕсли;

		СтрокаПараметра.ДобавленАвтоматически = Истина;
		ЗаполнитьТипПараметраСКД(СтрокаПараметра, ПараметрыЗапросов);
		
	КонецЦикла;

КонецПроцедуры

// Заполнить тип параметра СКД.
// 
// Параметры:
//  ПараметрСКД - ДанныеФормыЭлементКоллекции - Параметр СКД
//  ПараметрыЗапросов - ДанныеФормыКоллекция - Параметры запросов
&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьТипПараметраСКД(ПараметрСКД, ПараметрыЗапросов)
	
	ТипыПараметраЗапросов = Новый Массив;
	
	ПараметрыОтбора = Новый Структура("Имя", ПараметрСКД.Имя);
	НайденныеПараметрыЗапросов = ПараметрыЗапросов.НайтиСтроки(ПараметрыОтбора);
	Для Каждого ПараметрЗапроса Из НайденныеПараметрыЗапросов Цикл
		УИ_ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ТипыПараметраЗапросов, ПараметрЗапроса.ТипЗначения.Типы());		
	КонецЦикла;

	ПараметрСКД.ТипЗначения = Новый ОписаниеТипов(ТипыПараметраЗапросов);	
		
КонецПроцедуры

&НаСервере
Процедура ДобавитьПолеНабора(СтрокаНабора, Колонка, ВидыПолейНаборовДанных, МассивПолей, КолонкаРодитель = Неопределено)
	ОграничениеПоле=Ложь;
	ОграничениеУсловие=Ложь;
	ОграничениеГруппа=Ложь;
	ОграничениеПорядок=Ложь;
	ЗаполнятьОграничение=Ложь;
	Если ТипЗнч(Колонка) = Тип("КолонкаВложеннаяТаблицаСхемыЗапроса") Тогда
		Вид=ВидыПолейНаборовДанных.Набор;
		ИмяКолонки=Колонка.Псевдоним;
	ИначеЕсли ТипЗнч(Колонка) = Тип("КолонкаСхемыЗапроса") Тогда
		Вид=ВидыПолейНаборовДанных.Поле;
		ИмяКолонки=Колонка.Псевдоним;
	ИначеЕсли ТипЗнч(Колонка) = Тип("ПолеНастройки") Тогда
		Если Колонка.ТипЗначения = Новый ОписаниеТипов("ТаблицаЗначений") Тогда
			Вид=ВидыПолейНаборовДанных.Набор;
			ИмяКолонки=Колонка.Имя;
		Иначе
			Вид=ВидыПолейНаборовДанных.Поле;
			ИмяКолонки=Колонка.Имя;
		КонецЕсли;
		ЗаполнятьОграничение=Истина;

		ОграничениеПоле=Не Колонка.Поле;
		ОграничениеУсловие=Не Колонка.Отбор;
		ОграничениеГруппа=Не Колонка.Измерение;
		ОграничениеПорядок=Не Колонка.Порядок;
	КонецЕсли;

	Если КолонкаРодитель = Неопределено Тогда
		Поле=ИмяКолонки;
	Иначе
		Поле=КолонкаРодитель.Псевдоним + "." + ИмяКолонки;
	КонецЕсли;

	СтруктураПоиска=Новый Структура;
	СтруктураПоиска.Вставить("Поле", Поле);

	МассивСтрок=СтрокаНабора.Поля.НайтиСтроки(СтруктураПоиска);
	Если МассивСтрок.Количество() = 0 Тогда
		НовоеПоле=СтрокаНабора.Поля.Добавить();
		НовоеПоле.Поле=Поле;
		НовоеПоле.ПутьКДанным=Поле;
	Иначе
		НовоеПоле=МассивСтрок[0];
	КонецЕсли;
	НовоеПоле.Вид=Вид;
	НовоеПоле.Картинка=КартинкаВидаПоляНабораДанных(НовоеПоле.Вид, ВидыПолейНаборовДанных);

	Если ТипЗнч(Колонка) = Тип("КолонкаВложеннаяТаблицаСхемыЗапроса") Тогда
		Для Каждого ТекКолонка Из Колонка.Колонки Цикл
			ДобавитьПолеНабора(СтрокаНабора, ТекКолонка, ВидыПолейНаборовДанных, МассивПолей, Колонка);
		КонецЦикла;
	ИначеЕсли Вид = ВидыПолейНаборовДанных.Поле Тогда
		НовоеПоле.ТипЗначенияЗапроса=Колонка.ТипЗначения;
	КонецЕсли;

	Если ЗаполнятьОграничение Тогда
		НовоеПоле.ОграничениеИспользованияГруппировка=ОграничениеГруппа;
		НовоеПоле.ОграничениеИспользованияПоле=ОграничениеПоле;
		НовоеПоле.ОграничениеИспользованияПорядок=ОграничениеПорядок;
		НовоеПоле.ОграничениеИспользованияУсловие=ОграничениеУсловие;

		НовоеПоле.ОграничениеИспользованияРеквизитовГруппировка=ОграничениеГруппа;
		НовоеПоле.ОграничениеИспользованияРеквизитовПоле=ОграничениеПоле;
		НовоеПоле.ОграничениеИспользованияРеквизитовПорядок=ОграничениеПорядок;
		НовоеПоле.ОграничениеИспользованияРеквизитовУсловие=ОграничениеУсловие;
	КонецЕсли;

	МассивПолей.Добавить(Поле);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоляНабораДанныхПриИзмененииЗапросаНаСервере(ИдентификаторСтрокиНабора)
	СтрокаНабора=НаборыДанных.НайтиПоИдентификатору(ИдентификаторСтрокиНабора);

	МассивПолей=Новый Массив;
	ВидыПолейНаборовДанных=ВидыПолейНаборовДанных();
	ВидыНаборовДанных=ВидыНаборовДанных();

	Если Не СтрокаНабора.АвтоЗаполнениеДоступныхПолей Тогда
		ПостроительЗапроса=Новый ПостроительЗапроса(СтрокаНабора.Запрос);

		Для Каждого ДоступноеПоле Из ПостроительЗапроса.ДоступныеПоля Цикл
			ДобавитьПолеНабора(СтрокаНабора, ДоступноеПоле, ВидыПолейНаборовДанных, МассивПолей);
		КонецЦикла;

	Иначе

		СхемаЗапроса=Новый СхемаЗапроса;
		Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше_8_3_14() Тогда
			СхемаЗапроса.РежимКомпоновкиДанных=Истина;
		КонецЕсли;
		СхемаЗапроса.УстановитьТекстЗапроса(СтрокаНабора.Запрос);

		ИндексПакета=СхемаЗапроса.ПакетЗапросов.Количество() - 1;
		НужныйПакет=СхемаЗапроса.ПакетЗапросов[ИндексПакета];
		Пока ТипЗнч(НужныйПакет) <> Тип("ЗапросВыбораСхемыЗапроса") Цикл
			Если ИндексПакета < 0 Тогда
				Прервать;
			КонецЕсли;
			ИндексПакета=ИндексПакета - 1;
			НужныйПакет=СхемаЗапроса.ПакетЗапросов[ИндексПакета];
		КонецЦикла;

		Если ТипЗнч(НужныйПакет) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
			Возврат;
		КонецЕсли;
		Если СтрокаНабора.АвтоЗаполнениеДоступныхПолей Тогда
			Для Каждого Колонка Из НужныйПакет.Колонки Цикл
				ДобавитьПолеНабора(СтрокаНабора, Колонка, ВидыПолейНаборовДанных, МассивПолей);
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;

	УдалитьЛишниеПоляНабораПослеЗаполнения(СтрокаНабора, МассивПолей);

	РодительскийНабор=СтрокаНабора.ПолучитьРодителя();
	Если РодительскийНабор.Вид = ВидыНаборовДанных.Объединение Тогда
		ЗаполнитьПоляНабораДанныхОбъединениеПоПодчиненнымЗапросам(РодительскийНабор.ПолучитьИдентификатор());
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура УдалитьЛишниеПоляНабораПослеЗаполнения(СтрокаНабора, МассивДобавленныхПолей)
	ВидыПолейНаборовДанных=ВидыПолейНаборовДанных();

	МассивПолейКУдалению=Новый Массив;
	Для Каждого СтрокаПоля Из СтрокаНабора.Поля Цикл
		Если МассивДобавленныхПолей.Найти(СтрокаПоля.Поле) = Неопределено И СтрокаПоля.Вид
			<> ВидыПолейНаборовДанных.Папка Тогда
			МассивПолейКУдалению.Добавить(СтрокаПоля);
		КонецЕсли;
	КонецЦикла;

	Для Каждого Стр Из МассивПолейКУдалению Цикл
		СтрокаНабора.Поля.Удалить(Стр);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПоляНабораДанныхОбъединениеПоПодчиненнымЗапросам(ИдентификаторСтрокиНабора)
	СтрокаНабора=НаборыДанных.НайтиПоИдентификатору(ИдентификаторСтрокиНабора);

	ВидыПолейНаборов=ВидыПолейНаборовДанных();

	ПоляНаборы=Новый Массив;
	МассивПолей=Новый Массив;
	Для Каждого ТекНабор Из СтрокаНабора.ПолучитьЭлементы() Цикл
		Для Каждого ТекПоле Из ТекНабор.Поля Цикл
			Если ТекПоле.Вид = ВидыПолейНаборов.Набор Тогда
				ПоляНаборы.Добавить(ТекПоле.ПутьКДанным);
			КонецЕсли;

			СтруктураПоиска=Новый Структура;
			СтруктураПоиска.Вставить("ПутьКДанным", ТекПоле.ПутьКДанным);

			НайденныеСтроки=СтрокаНабора.Поля.НайтиСтроки(СтруктураПоиска);
			Если НайденныеСтроки.Количество() = 0 Тогда
				НовоеПоле=СтрокаНабора.Поля.Добавить();
				НовоеПоле.Вид=ТекПоле.Вид;
				НовоеПоле.ПутьКДанным=ТекПоле.ПутьКДанным;
				НовоеПоле.Заголовок=УИ_СтроковыеФункцииКлиентСервер.ПредставлениеИдентификатора(НовоеПоле.ПутьКДанным);
				НовоеПоле.Поле=НовоеПоле.ПутьКДанным;
			Иначе
				НовоеПоле=НайденныеСтроки[0];
			КонецЕсли;

			МассивПолей.Добавить(НовоеПоле.ПутьКДанным);

		КонецЦикла;
	КонецЦикла;

	НовыйМассивПолей=Новый Массив;
	Для Каждого Поле Из МассивПолей Цикл
		Если ПоляНаборы.Найти(Поле) = Неопределено Тогда
			НовыйМассивПолей.Добавить(Поле);
		КонецЕсли;
	КонецЦикла;

	УдалитьЛишниеПоляНабораПослеЗаполнения(СтрокаНабора, НовыйМассивПолей);

	ВидыНаборовДанных=ВидыНаборовДанных();
	РодительскийНабор=СтрокаНабора.ПолучитьРодителя();
	Если РодительскийНабор.Вид = ВидыНаборовДанных.Объединение Тогда
		ЗаполнитьПоляНабораДанныхОбъединениеПоПодчиненнымЗапросам(РодительскийНабор.ПолучитьИдентификатор());
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьКонструкторЗапросаЗавершение(Текст, ДополнительныеПараметры) Экспорт
	Если Текст = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ИдентификаторСтроки=ДополнительныеПараметры.ТекСтрока;
	СтрокаНабора=НаборыДанных.НайтиПоИдентификатору(ИдентификаторСтроки);

	СтрокаНабора.Запрос=Текст;
	УстановитьТекстЗапроса(Текст);

	ЗаполнитьПоляНабораДанныхПриИзмененииЗапроса(ИдентификаторСтроки);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьНаборДанных(Вид)
	ТекДанные=Элементы.НаборыДанных.ТекущиеДанные;
	Если ТекДанные.Вид = ВидыНаборовДанных.Объединение Тогда
		СтрокаДереваДляДобавления=НаборыДанных.НайтиПоИдентификатору(Элементы.НаборыДанных.ТекущаяСтрока);
	Иначе
		СтрокаДереваДляДобавления=НаборыДанных.НайтиПоИдентификатору(ИдентификаторНулевогоНабораДанных);
	КонецЕсли;

	НаборДанных=СтрокаДереваДляДобавления.ПолучитьЭлементы().Добавить();
	НаборДанных.Имя="НаборДанных" + НаборДанных.ПолучитьИдентификатор();
	НаборДанных.Вид=Вид;

	Если Вид = ВидыНаборовДанных.Запрос Тогда
		НаборДанных.Картинка=БиблиотекаКартинок.УИ_НаборДанныхСКДЗапрос;
		НаборДанных.АвтоЗаполнениеДоступныхПолей=Истина;
		НаборДанных.ИспользоватьГруппировкиЗапросаЕслиВозможно=Истина;
	ИначеЕсли Вид = ВидыНаборовДанных.Объект Тогда
		НаборДанных.Картинка=БиблиотекаКартинок.УИ_НаборДанныхСКДОбъект;
	ИначеЕсли Вид = ВидыНаборовДанных.Объединение Тогда
		НаборДанных.Картинка=БиблиотекаКартинок.УИ_НаборДанныхСКДОбъединение;
	КонецЕсли;

	Элементы.НаборыДанных.ТекущаяСтрока=НаборДанных.ПолучитьИдентификатор();

	Если ИсточникиДанных.Количество() > 0 Тогда
		НаборДанных.ИсточникДанных=ИсточникиДанных[0].Имя;
	КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ВидыНаборовДанных()
	Структура=Новый Структура;
	Структура.Вставить("Корень", "Корень");
	Структура.Вставить("Запрос", "НаборДанныхЗапросСхемыКомпоновкиДанных");
	Структура.Вставить("Объект", "НаборДанныхОбъектСхемыКомпоновкиДанных");
	Структура.Вставить("Объединение", "НаборДанныхОбъединениеСхемыКомпоновкиДанных");

	Возврат Структура;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ВидыПолейНаборовДанных()
	Структура=Новый Структура;
	Структура.Вставить("Поле", "ПолеНабораДанныхСхемыКомпоновкиДанных");
	Структура.Вставить("Папка", "ПапкаПолейНабораДанныхСхемыКомпоновкиДанных");
	Структура.Вставить("Набор", "ВложенныйНаборДанныхСхемыКомпоновкиДанных");

	Возврат Структура;

КонецФункции

&НаКлиенте
Функция НаборыДанныхВерхнегоУровня()
	МассивНаборов=Новый Массив;

	НулевойНаборДанных=НаборыДанных.НайтиПоИдентификатору(ИдентификаторНулевогоНабораДанных);
	Для Каждого Набор Из НулевойНаборДанных.ПолучитьЭлементы() Цикл
		МассивНаборов.Добавить(Набор);
	КонецЦикла;

	Возврат МассивНаборов;
КонецФункции

&НаКлиенте
Процедура ЗаполнитьСписокВыбораИсточникаДанныхНабора()
	Элементы.НаборыДанныхИсточникДанных.СписокВыбора.Очистить();

	Для Каждого Стр Из ИсточникиДанных Цикл
		Элементы.НаборыДанныхИсточникДанных.СписокВыбора.Добавить(Стр.Имя);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ГруппаНаборыДанныхПраваяПанельПриСменеСтраницы(Элемент, ТекущаяСтраница)
	ЗаполнитьСписокВыбораИсточникаДанныхНабора();
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеРолиПоляНабораДанных(Роль)
	Если Роль = Неопределено Тогда
		Возврат "";
	КонецЕсли;

	МассивПредставления=Новый Массив;

	Если Роль.Период Тогда
		МассивПредставления.Добавить("Период");
		МассивПредставления.Добавить(Роль.НомерПериода);
		Если Роль.ПериодДополнительный Тогда
			МассивПредставления.Добавить("Доп");
		КонецЕсли;
	КонецЕсли;

	Если Роль.Измерение Тогда
		МассивПредставления.Добавить("Измерение");
		Если ЗначениеЗаполнено(Роль.РодительскоеИзмерение) Тогда
			МассивПредставления.Добавить(Роль.РодительскоеИзмерение);
		КонецЕсли;
	КонецЕсли;

	Если Роль.Счет Тогда
		МассивПредставления.Добавить("Счет");
		МассивПредставления.Добавить(Роль.ВыражениеВидаСчета);
	КонецЕсли;

	Если Роль.Остаток Тогда
		Если НРег(Роль.ТипОстатка) = "начальныйостаток" Тогда
			МассивПредставления.Добавить("НачОст");
		ИначеЕсли НРег(Роль.ТипОстатка) = "конечныйостаток" Тогда
			МассивПредставления.Добавить("КонОст");
		КонецЕсли;
		Если НРег(Роль.ТипБухгалтерскогоОстатка) = "дебет" Тогда
			МассивПредставления.Добавить("Дт");
		ИначеЕсли НРег(Роль.ТипБухгалтерскогоОстатка) = "кредит" Тогда
			МассивПредставления.Добавить("Кт");
		КонецЕсли;

		Если ЗначениеЗаполнено(Роль.ГруппаОстатка) Тогда
			МассивПредставления.Добавить(Роль.ГруппаОстатка);
		КонецЕсли;
		Если ЗначениеЗаполнено(Роль.ПолеСчета) Тогда
			МассивПредставления.Добавить(Роль.ПолеСчета);
		КонецЕсли;
	КонецЕсли;

	Если Роль.ИгнорироватьЗначенияNULL Тогда
		МассивПредставления.Добавить("NULL");
	КонецЕсли;

	Если Роль.Обязательное Тогда
		МассивПредставления.Добавить("Обязательное");
	КонецЕсли;

	Возврат СтрСоединить(МассивПредставления, ", ");
КонецФункции

&НаКлиенте
Процедура НаборыДанныхПоляРольПредставлениеНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаНабора=НаборыДанных.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтрокиНабора);

	СтрокаПоля=СтрокаНабора.Поля.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	СтрокаПоля.Роль=Результат;

	СтрокаПоля.РольПредставление=ПредставлениеРолиПоляНабораДанных(СтрокаПоля.Роль);
КонецПроцедуры

&НаКлиенте
Процедура ПоляДоступныеЗначенияНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаНабора=НаборыДанных.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтрокиНабора);

	СтрокаПоля=СтрокаНабора.Поля.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	СтрокаПоля.ДоступныеЗначения=Результат;
КонецПроцедуры

&НаКлиенте
Процедура ВручнуюДобавитьПолеНабораДанных(ВидПоля)
	СтрокаНабора=Элементы.НаборыДанных.ТекущиеДанные;
	Если СтрокаНабора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	НовоеПоле=СтрокаНабора.Поля.Добавить();
	НовоеПоле.Вид=ВидПоля;
	НовоеПоле.Картинка=КартинкаВидаПоляНабораДанных(ВидПоля, ВидыПолейНаборовДанных);
	НовоеПоле.ПутьКДанным="Поле" + НовоеПоле.ПолучитьИдентификатор();
	НовоеПоле.Заголовок=УИ_СтроковыеФункцииКлиентСервер.ПредставлениеИдентификатора(НовоеПоле.ПутьКДанным);
	Если ВидПоля <> ВидыПолейНаборовДанных.Папка Тогда
		НовоеПоле.Поле=НовоеПоле.ПутьКДанным;
	КонецЕсли;

	Элементы.НаборыДанныхПоля.ТекущаяСтрока=НовоеПоле.ПолучитьИдентификатор();
	
	РодительскийНабор=СтрокаНабора.ПолучитьРодителя();
	Если РодительскийНабор.Вид=ВидыНаборовДанных.Объединение Тогда
		ЗаполнитьПоляНабораДанныхОбъединениеПоПодчиненнымЗапросам(РодительскийНабор.ПолучитьИдентификатор());
	КонецЕсли;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция КартинкаВидаПоляНабораДанных(Вид, ВидыПолейНабора)
	Если Вид = ВидыПолейНабора.Поле Тогда
		Картинка=БиблиотекаКартинок.Реквизит;
	ИначеЕсли Вид = ВидыПолейНабора.Набор Тогда
		Картинка=БиблиотекаКартинок.ВложеннаяТаблица;
	Иначе
		Картинка=БиблиотекаКартинок.УИ_Папка;
	КонецЕсли;

	Возврат Картинка;
КонецФункции

&НаКлиенте
Функция ДоступноДобавлениеПоляНабораПоле(ТекСтрокаНабора)
	Возврат ТекСтрокаНабора.Вид = ВидыНаборовДанных.Объект;
КонецФункции

&НаКлиенте
Функция ДоступноДобавлениеПоляНабораНабор(ТекСтрокаНабора)
	Возврат ТекСтрокаНабора.Вид = ВидыНаборовДанных.Объект;
КонецФункции

&НаКлиенте
Функция ДоступноКопированиеУдаленияПоляНабора(ТекСтрокаНабора, ТекСтрокаПоля)
	Если ТекСтрокаПоля = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;

	Возврат ТекСтрокаПоля.Вид = ВидыПолейНаборовДанных.Папка Или (ДоступноДобавлениеПоляНабораПоле(ТекСтрокаНабора)
		И ТекСтрокаПоля.Вид = ВидыПолейНаборовДанных.Поле) Или (ДоступноДобавлениеПоляНабораНабор(ТекСтрокаНабора)
		И ТекСтрокаПоля.Вид = ВидыПолейНаборовДанных.Набор);
КонецФункции

&НаКлиенте
Процедура УстановитьДоступностьКнопокДобавленияПолейНабора()
	ТекНабор=Элементы.НаборыДанных.ТекущиеДанные;
	Если ТекНабор = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если ТекНабор.ПолучитьИдентификатор() = ИдентификаторНулевогоНабораДанных Тогда
		Возврат;
	КонецЕсли;

	ДоступноДобавлениеПоля=ДоступноДобавлениеПоляНабораПоле(ТекНабор);
	ДоступноДобавлениеНабора=ДоступноДобавлениеПоляНабораНабор(ТекНабор);
	ДоступноКопирование=ДоступноКопированиеУдаленияПоляНабора(ТекНабор, Элементы.НаборыДанныхПоля.ТекущиеДанные);
	ДоступноУдаление=ДоступноКопирование;

	Элементы.НаборыДанныхПоляДобавитьПолеНабораПоле.Доступность=ДоступноДобавлениеПоля;
	Элементы.НаборыДанныхПоляДобавитьПолеНабораПоле1.Видимость=ДоступноДобавлениеПоля;

	Элементы.НаборыДанныхПоляДобавитьПолеНабораНабор.Доступность=ДоступноДобавлениеНабора;
	Элементы.НаборыДанныхПоляДобавитьПолеНабораНабор1.Видимость=ДоступноДобавлениеНабора;

	Элементы.НаборыДанныхПоляСкопировать.Доступность=ДоступноКопирование;
	Элементы.НаборыДанныхПоляСкопировать1.Видимость=ДоступноКопирование;

	Элементы.НаборыДанныхПоляУдалить.Доступность=ДоступноКопирование;
	Элементы.НаборыДанныхПоляУдалить1.Видимость=ДоступноУдаление;

КонецПроцедуры

&НаКлиенте
Процедура ПоляТипЗначенияНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат=Неопределено Тогда
		Возврат;
	КонецЕсли;
	СтрокаНабора=Элементы.НаборыДанных.ТекущиеДанные;
	Если СтрокаНабора = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанныеСтроки=СтрокаНабора.Поля.НайтиПоИдентификатору(ДополнительныеПараметры.ТекСтрока);
	ТекДанныеСтроки.ТипЗначения=Результат;
КонецПроцедуры

&НаКлиенте
Процедура СохранитьТекстЗапросаВТекущийНабор()
	ДанныеСтрокиПредыдущегоНабора = НаборыДанных.НайтиПоИдентификатору(ИдентификаторСтрокиТекущегоНабораДанных);
	Если ДанныеСтрокиПредыдущегоНабора <> Неопределено Тогда
		Если ДанныеСтрокиПредыдущегоНабора.Вид = ВидыНаборовДанных.Запрос Тогда
			ДанныеСтрокиПредыдущегоНабора.Запрос = ТекущийТекстЗапроса();
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПоляВыражениеПредставленияОткрытиеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	СтрокаНабора=Элементы.НаборыДанных.ТекущиеДанные;
	Если СтрокаНабора = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанныеСтроки=СтрокаНабора.Поля.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	ТекДанныеСтроки.ВыражениеПредставления=Результат;
КонецПроцедуры


#КонецОбласти

#Область СвязиНаборовДанных
&НаКлиенте
Процедура ЗаполнитьСписокВыбораПоляСвязиНаборов(ИмяНабораДанных, ЭлементПоля)
	ЭлементПоля.СписокВыбора.Очистить();

	НаборДанных=НаборДанныхПоИмени(ИмяНабораДанных);
	Если НаборДанных = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Для Каждого Поле Из НаборДанных.Поля Цикл
		ЭлементПоля.СписокВыбора.Добавить(Поле.ПутьКДанным);
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьВспомогательныеДанныеСвязейНаборовДанных()
	Наборы=НаборыДанныхВерхнегоУровня();

	Элементы.СвязиНаборовДанныхНаборДанныхИсточник.СписокВыбора.Очистить();
	Элементы.СвязиНаборовДанныхНаборДанныхПриемник.СписокВыбора.Очистить();

	Для Каждого Набор Из Наборы Цикл
		Элементы.СвязиНаборовДанныхНаборДанныхИсточник.СписокВыбора.Добавить(Набор.Имя);
		Элементы.СвязиНаборовДанныхНаборДанныхПриемник.СписокВыбора.Добавить(Набор.Имя);
	КонецЦикла;
КонецПроцедуры
#КонецОбласти

#Область ВычисляемыеПоля
&НаКлиенте
Процедура ВычисляемыеПоляВыражениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаРесурса=ВычисляемыеПоля.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	СтрокаРесурса.Выражение=Результат;
КонецПроцедуры

&НаКлиенте
Процедура ВычисляемыеПоляДоступныеЗначенияНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаПоля=ВычисляемыеПоля.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	СтрокаПоля.ДоступныеЗначения=Результат;
КонецПроцедуры

&НаКлиенте
Процедура ВычисляемыеПоляТипЗначенияНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат=Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанныеСтроки=ВычисляемыеПоля.НайтиПоИдентификатору(ДополнительныеПараметры.ТекСтрока);
	ТекДанныеСтроки.ТипЗначения=Результат;
КонецПроцедуры

#КонецОбласти

#Область Ресурсы
&НаКлиенте
Процедура РесурсыГруппировкиНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаРесурса=Ресурсы.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	СтрокаРесурса.Группировки=Результат;
КонецПроцедуры

&НаКлиенте
Процедура РесурсыВыражениеОткрытиеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаРесурса=Ресурсы.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	СтрокаРесурса.Выражение=Результат;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРесурс(СтрокаДоступногоПоля)
	Если ТипЗнч(СтрокаДоступногоПоля) = Тип("Число") Тогда
		ДоступноеПоле=ДоступныеПоляРесурсов.НайтиПоИдентификатору(СтрокаДоступногоПоля);
	Иначе
		ДоступноеПоле=СтрокаДоступногоПоля;
	КонецЕсли;

	НС=Ресурсы.Добавить();
	НС.ПутьКДанным=ДоступноеПоле.ПутьКДанным;

	Если ДоступноеПоле.ВычисляемоеПоле Или ДоступноеПоле.Числовое Тогда
		НС.Выражение=СтрШаблон("Сумма(%1)", НС.ПутьКДанным);
	Иначе
		НС.Выражение=СтрШаблон("Количество(%1)", НС.ПутьКДанным);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьДоступныеПоляРесурсов()
	ДоступныеПоляРесурсов.Очистить();

	НаборыДанныхВерхнегоУровня=НаборыДанныхВерхнегоУровня();

	КартинкаРеквизит=БиблиотекаКартинок.Реквизит;
	КартинкаПроизвольноеВыражение=БиблиотекаКартинок.ПроизвольноеВыражение;

	МассивПутей=Новый Массив;

	Для Каждого Набор Из НаборыДанныхВерхнегоУровня Цикл
		Для Каждого Поле Из Набор.Поля Цикл
			Если МассивПутей.Найти(Поле.ПутьКДанным) <> Неопределено Тогда
				Продолжить;
			КонецЕсли;

			Если Поле.Вид <> ВидыПолейНаборовДанных.Поле Тогда
				Продолжить;
			КонецЕсли;

			НС=ДоступныеПоляРесурсов.Добавить();
			НС.ПутьКДанным=Поле.ПутьКДанным;
			НС.Картинка=КартинкаРеквизит;

			НС.Числовое= Поле.ТипЗначенияЗапроса.СодержитТип(тип("Число"));

			МассивПутей.Добавить(Поле.ПутьКДанным);
		КонецЦикла;
	КонецЦикла;

	Для Каждого Поле Из ВычисляемыеПоля Цикл
		Если МассивПутей.Найти(Поле.ПутьКДанным) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		НС=ДоступныеПоляРесурсов.Добавить();
		НС.ПутьКДанным=Поле.ПутьКДанным;
		НС.ВычисляемоеПоле=Истина;
		НС.Картинка=КартинкаПроизвольноеВыражение;

		МассивПутей.Добавить(Поле.ПутьКДанным);

	КонецЦикла;

	ДоступныеПоляРесурсов.Сортировать("ПутьКДанным Возр");
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРесурсыНеПодходящиеПоДоступнымПолям()
	МассивУдаляемыхСтрок=Новый Массив;
	Для Каждого Стр Из Ресурсы Цикл
		СтруктураПоиска=Новый Структура;
		СтруктураПоиска.Вставить("ПутьКДанным", Стр.ПутьКДанным);

		НайденныеСтроки=ДоступныеПоляРесурсов.НайтиСтроки(СтруктураПоиска);
		Если НайденныеСтроки.Количество() = 0 Тогда
			МассивУдаляемыхСтрок.Добавить(стр);
		КонецЕсли;
	КонецЦикла;

	Для Каждого Стр Из МассивУдаляемыхСтрок Цикл
		Ресурсы.Удалить(Стр);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьВспомогательныеДанныеРесурсов()
	ЗаполнитьДоступныеПоляРесурсов();
	УдалитьРесурсыНеПодходящиеПоДоступнымПолям();
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьСписокВыбораВыраженияРесурса(ИдентификаторСтрокиРесурса)
	Элементы.РесурсыВыражение.СписокВыбора.Очистить();

	СтрокаРесурса=Ресурсы.НайтиПоИдентификатору(ИдентификаторСтрокиРесурса);

	СтруктураПоиска=Новый Структура;
	СтруктураПоиска.Вставить("ПутьКДанным", СтрокаРесурса.ПутьКДанным);

	СтрокиДоступныхПолей=ДоступныеПоляРесурсов.НайтиСтроки(СтруктураПоиска);
	Если СтрокиДоступныхПолей.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	СтрокаДоступногоПоля=СтрокиДоступныхПолей[0];

	Если СтрокаДоступногоПоля.ВычисляемоеПоле Или СтрокаДоступногоПоля.Числовое Тогда
		Элементы.РесурсыВыражение.СписокВыбора.Добавить(СтрШаблон("Сумма(%1)", СтрокаРесурса.ПутьКДанным));
		Элементы.РесурсыВыражение.СписокВыбора.Добавить(СтрШаблон("Среднее(%1)", СтрокаРесурса.ПутьКДанным));
	КонецЕсли;
	Элементы.РесурсыВыражение.СписокВыбора.Добавить(СтрШаблон("Максимум(%1)", СтрокаРесурса.ПутьКДанным));
	Элементы.РесурсыВыражение.СписокВыбора.Добавить(СтрШаблон("Минимум(%1)", СтрокаРесурса.ПутьКДанным));
	Элементы.РесурсыВыражение.СписокВыбора.Добавить(СтрШаблон("Количество(%1)", СтрокаРесурса.ПутьКДанным));
	Элементы.РесурсыВыражение.СписокВыбора.Добавить(СтрШаблон("Количество(Различные %1)", СтрокаРесурса.ПутьКДанным));

КонецПроцедуры
#КонецОбласти

#Область Параметры

&НаКлиенте
Процедура ПараметрыСКДЗначениеНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаРесурса=ПараметрыСКД.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	СтрокаРесурса.Значение=Результат;
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыСКДДоступныеЗначенияНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаРесурса=ПараметрыСКД.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	СтрокаРесурса.ДоступныеЗначения=Результат;

	УстановитьСписокВыбораПоляЗначенияПараметра(СтрокаРесурса);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьСписокВыбораПоляЗначенияПараметра(СтрокаПараметров)
	Элементы.ПараметрыСКДЗначение.РежимВыбораИзСписка=СтрокаПараметров.ДоступныеЗначения.Количество() > 0
		И Не СтрокаПараметров.ДоступенСписокЗначений;

	Элементы.ПараметрыСКДЗначение.СписокВыбора.Очистить();

	Для Каждого ЭлементСписка Из СтрокаПараметров.ДоступныеЗначения Цикл
		Элементы.ПараметрыСКДЗначение.СписокВыбора.Добавить(ЭлементСписка.Значение, ЭлементСписка.Представление);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОграничениеТипаПоляЗначенияПараметра(СтрокаПараметров)
	Если СтрокаПараметров.ТипЗначения = Новый ОписаниеТипов Тогда
		Возврат;
	КонецЕсли;

	Если СтрокаПараметров.ДоступенСписокЗначений Тогда
		Элементы.ПараметрыСКДЗначение.ОграничениеТипа=Новый ОписаниеТипов("СписокЗначений");
	Иначе
		Элементы.ПараметрыСКДЗначение.ОграничениеТипа=СтрокаПараметров.ТипЗначения;
	КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПараметрыСКДВыражениеОткрытиеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаРесурса=ПараметрыСКД.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	СтрокаРесурса.Выражение=Результат;
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыСКДТипЗначенияНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат=Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанныеСтроки=ПараметрыСКД.НайтиПоИдентификатору(ДополнительныеПараметры.ТекСтрока);
	ТекДанныеСтроки.ТипЗначения=Результат;
	
	Если ТекДанныеСтроки.ДоступенСписокЗначений Тогда
		НовоеЗначение=Новый СписокЗначений;

		Для Каждого ЭлементСписка Из ТекДанныеСтроки.Значение Цикл
			Если ТекДанныеСтроки.ТипЗначения.СодержитТип(ТипЗнч(ЭлементСписка.Значение)) Тогда
				НовоеЗначение.Добавить(ЭлементСписка.Значение);
			КонецЕсли;
		КонецЦикла;
		ТекДанныеСтроки.Значение=НовоеЗначение;
	Иначе
		ТекДанныеСтроки.Значение=ТекДанныеСтроки.ТипЗначения.ПривестиЗначение(ТекДанныеСтроки.Значение);
	КонецЕсли;

	УстановитьОграничениеТипаПоляЗначенияПараметра(ТекДанныеСтроки);

КонецПроцедуры

#КонецОбласти

#Область НастройкиКомпоновки
&НаКлиенте
Процедура ПоляГруппировкиНедоступны()

	Элементы.СтраницыПолейГруппировки.ТекущаяСтраница = Элементы.НедоступныеНастройкиПолейГруппировки;

КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляДоступны(ЭлементСтруктуры)

	Если КомпоновщикТекущихНастроек.Настройки.НаличиеВыбораУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныеВыбранныеПоля = Истина;
		Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.НастройкиВыбранныхПолей;

	Иначе

		ЛокальныеВыбранныеПоля = Ложь;
		Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.ОтключенныеНастройкиВыбранныхПолей;

	КонецЕсли;

	Элементы.ЛокальныеВыбранныеПоля.ТолькоПросмотр = Ложь;

КонецПроцедуры

&НаКлиенте
Процедура ВыбранныеПоляНедоступны()

	ЛокальныеВыбранныеПоля = Ложь;
	Элементы.ЛокальныеВыбранныеПоля.ТолькоПросмотр = Истина;
	Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.НедоступныеНастройкиВыбранныхПолей;

КонецПроцедуры

&НаКлиенте
Процедура ОтборДоступен(ЭлементСтруктуры)

	Если КомпоновщикТекущихНастроек.Настройки.НаличиеОтбораУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныйОтбор = Истина;
		Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.НастройкиОтбора;

	Иначе

		ЛокальныйОтбор = Ложь;
		Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.ОтключенныеНастройкиОтбора;

	КонецЕсли;

	Элементы.ЛокальныйОтбор.ТолькоПросмотр = Ложь;

КонецПроцедуры

&НаКлиенте
Процедура ОтборНедоступен()

	ЛокальныйОтбор = Ложь;
	Элементы.ЛокальныйОтбор.ТолькоПросмотр = Истина;
	Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.НедоступныеНастройкиОтбора;

КонецПроцедуры

&НаКлиенте
Процедура ПорядокДоступен(ЭлементСтруктуры)

	Если КомпоновщикТекущихНастроек.Настройки.НаличиеПорядкаУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныйПорядок = Истина;
		Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.НастройкиПорядка;

	Иначе

		ЛокальныйПорядок = Ложь;
		Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПорядка;

	КонецЕсли;

	Элементы.ЛокальныйПорядок.ТолькоПросмотр = Ложь;

КонецПроцедуры

&НаКлиенте
Процедура ПорядокНедоступен()

	ЛокальныйПорядок = Ложь;
	Элементы.ЛокальныйПорядок.ТолькоПросмотр = Истина;
	Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.НедоступныеНастройкиПорядка;

КонецПроцедуры

&НаКлиенте
Процедура УсловноеОформлениеДоступно(ЭлементСтруктуры)

	Если КомпоновщикТекущихНастроек.Настройки.НаличиеУсловногоОформленияУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальноеУсловноеОформление = Истина;
		Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.НастройкиУсловногоОформления;

	Иначе

		ЛокальноеУсловноеОформление = Ложь;
		Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.ОтключенныеНастройкиУсловногоОформления;

	КонецЕсли;

	Элементы.ЛокальноеУсловноеОформление.ТолькоПросмотр = Ложь;

КонецПроцедуры

&НаКлиенте
Процедура УсловноеОформлениеНедоступно()

	ЛокальноеУсловноеОформление = Ложь;
	Элементы.ЛокальноеУсловноеОформление.ТолькоПросмотр = Истина;
	Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.НедоступныеНастройкиУсловногоОформления;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыВыводаДоступны(ЭлементСтруктуры)

	Если КомпоновщикТекущихНастроек.Настройки.НаличиеПараметровВыводаУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныеПараметрыВывода = Истина;
		Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.НастройкиПараметровВывода;

	Иначе

		ЛокальныеПараметрыВывода = Ложь;
		Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПараметровВывода;

	КонецЕсли;

	Элементы.ЛокальныеПараметрыВывода.ТолькоПросмотр = Ложь;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыВыводаНедоступны()

	ЛокальныеПараметрыВывода = Ложь;
	Элементы.ЛокальныеПараметрыВывода.ТолькоПросмотр = Истина;
	Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.НедоступныеНастройкиПараметровВывода;

КонецПроцедуры
#КонецОбласти

#Область ВариантыНастроек

&НаСервере
Процедура ИнициализироватьКомпоновщикНастроекПоСобраннойСКД()

	КомпоновщикТекущихНастроек.Инициализировать(
			Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных));
	КомпоновщикТекущихНастроек.Восстановить();
КонецПроцедуры

&НаСервере
Процедура СохранитьВТаблицуФормыНастройкуТекущегоВариантаНастроек()
	СтрокаПредыдущегоВарианта=ВариантыНастроек.НайтиПоИдентификатору(ИдентификаторСтрокиТекущегоВариантаНастроек);
	СтрокаПредыдущегоВарианта.Настройки=УИ_ОбщегоНазначения.ЗначениеВСтрокуXML(
		КомпоновщикТекущихНастроек.ПолучитьНастройки());
КонецПроцедуры

&НаСервере
Процедура ВариантыНастроекПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки)
	Если ИдентификаторСтроки = ИдентификаторСтрокиТекущегоВариантаНастроек Тогда
		Возврат;
	КонецЕсли;

	ТекДанные=ВариантыНастроек.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СохранитьВТаблицуФормыНастройкуТекущегоВариантаНастроек();

	ИдентификаторСтрокиТекущегоВариантаНастроек=ИдентификаторСтроки;

	Если ЗначениеЗаполнено(ТекДанные.Настройки) Тогда
		Настройки=УИ_ОбщегоНазначения.ЗначениеИзСтрокиXML(ТекДанные.Настройки);
	Иначе
		Настройки=Новый НастройкиКомпоновкиДанных;
	КонецЕсли;

	КомпоновщикТекущихНастроек.ЗагрузитьНастройки(Настройки);
	КомпоновщикТекущихНастроек.Восстановить();
КонецПроцедуры

#КонецОбласти

#Область РедакторКода

&НаКлиенте
Процедура УстановитьТекстЗапроса(НовыйТекст, УстанавливатьОригинальныйТекст = Ложь, НовыйОригинальныйТекст = "")
	УИ_РедакторКодаКлиент.УстановитьТекстРедактора(ЭтотОбъект, "Запрос", НовыйТекст);

	Если УстанавливатьОригинальныйТекст Тогда
		УИ_РедакторКодаКлиент.УстановитьОригинальныйТекстРедактора(ЭтотОбъект, "Запрос", НовыйОригинальныйТекст);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ТекущийТекстЗапроса()
	Возврат УИ_РедакторКодаКлиент.ТекстКодаРедактора(ЭтотОбъект, "Запрос");
КонецФункции

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ПолеРедактораДокументСформирован(Элемент)
	УИ_РедакторКодаКлиент.ПолеРедактораHTMLДокументСформирован(ЭтотОбъект, Элемент);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ПолеРедактораПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	УИ_РедакторКодаКлиент.ПолеРедактораHTMLПриНажатии(ЭтотОбъект, Элемент, ДанныеСобытия, СтандартнаяОбработка);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_РедакторКодаОтложеннаяИнициализацияРедакторов()
	УИ_РедакторКодаКлиент.РедакторКодаОтложеннаяИнициализацияРедакторов(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_РедакторКодаЗавершениеИнициализацииРедактора(ИдентификаторРедактора) Экспорт
	СтрокаНабора = НаборыДанных.НайтиПоИдентификатору(ИдентификаторСтрокиТекущегоНабораДанных);
	Если СтрокаНабора = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьТекстЗапроса(СтрокаНабора.Запрос, Истина, СтрокаНабора.ЗапросОриганальный);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_РедакторКодаОтложеннаяОбработкаСобытийРедактора() Экспорт
	УИ_РедакторКодаКлиент.ОтложеннаяОбработкаСобытийРедактора(ЭтотОбъект);
КонецПроцедуры

#КонецОбласти

&НаКлиенте
Функция ПоляДляФормыРедактированияВыражения(ДобавлятьПараметры)
	Поля = Новый Массив;
	
	НаборыДанныхВерхнегоУровня=НаборыДанныхВерхнегоУровня();

	МассивПутей=Новый Массив;

	Для Каждого Набор Из НаборыДанныхВерхнегоУровня Цикл
		Для Каждого Поле Из Набор.Поля Цикл
			Если МассивПутей.Найти(Поле.ПутьКДанным) <> Неопределено Тогда
				Продолжить;
			КонецЕсли;

			ТекПоле = Новый Структура;
			ТекПоле.Вставить("Вид", Поле.Вид);
			ТекПоле.Вставить("Поле", Поле.Поле);
			ТекПоле.Вставить("ПутьКДанным", Поле.ПутьКДанным);
			ТекПоле.Вставить("ТипЗначения", Поле.ТипЗначения);
			ТекПоле.Вставить("ТипЗначенияЗапроса", Поле.ТипЗначенияЗапроса);
			ТекПоле.Вставить("ВычисляемоеПоле", Ложь);
			Поля.Добавить(ТекПоле);

			МассивПутей.Добавить(Поле.ПутьКДанным);
		КонецЦикла;
	КонецЦикла;

	Для Каждого Поле Из ВычисляемыеПоля Цикл
		Если МассивПутей.Найти(Поле.ПутьКДанным) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		ТекПоле = Новый Структура;
		ТекПоле.Вставить("Вид", ВидыПолейНаборовДанных.Поле);
		ТекПоле.Вставить("Поле", Поле.ПутьКДанным);
		ТекПоле.Вставить("ПутьКДанным", Поле.ПутьКДанным);
		ТекПоле.Вставить("ТипЗначения", Поле.ТипЗначения);
		ТекПоле.Вставить("ТипЗначенияЗапроса", Поле.ТипЗначения);
		ТекПоле.Вставить("ВычисляемоеПоле", Истина);
		Поля.Добавить(ТекПоле);

		МассивПутей.Добавить(Поле.ПутьКДанным);

	КонецЦикла;

	Если ДобавлятьПараметры Тогда
		Для Каждого ТекПараметр Из ПараметрыСКД Цикл
			ТекПоле = Новый Структура;
			ТекПоле.Вставить("Вид", ВидыПолейНаборовДанных.Поле);
			ТекПоле.Вставить("Поле", ТекПараметр.Имя);
			ТекПоле.Вставить("ПутьКДанным", "ПараметрыДанных." + ТекПараметр.Имя);
			ТекПоле.Вставить("ТипЗначения", ТекПараметр.ТипЗначения);
			ТекПоле.Вставить("ТипЗначенияЗапроса", ТекПараметр.ТипЗначения);
			ТекПоле.Вставить("ВычисляемоеПоле", Ложь);
			Поля.Добавить(ТекПоле);
		КонецЦикла;
	КонецЕсли;

	Возврат Поля;	
КонецФункции

&НаКлиенте
Процедура ОткрытьФормуРедактированияВыражения(Текст, ОписаниеОповещенияОЗакрытии, ДобавлятьПараметры, Заголовок = "",
	РежимОткрытия = Неопределено) Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Текст", Текст);
	ПараметрыФормы.Вставить("Заголовок", Заголовок);
	ПараметрыФормы.Вставить("ВидыПолейНаборовДанных", ВидыПолейНаборовДанных);
	ПараметрыФормы.Вставить("Поля", ПоляДляФормыРедактированияВыражения(ДобавлятьПараметры));

	Если РежимОткрытия = Неопределено Тогда
		ОткрытьФорму("Обработка.УИ_РедакторСКД.Форма.ФормаРедактированияВыражения",
					 ПараметрыФормы,
					 ,
					 ,
					 ,
					 ,
					 ОписаниеОповещенияОЗакрытии);
	Иначе
		ОткрытьФорму("Обработка.УИ_РедакторСКД.Форма.ФормаРедактированияВыражения",
					 ПараметрыФормы,
					 ,
					 ,
					 ,
					 ,
					 ОписаниеОповещенияОЗакрытии,
					 РежимОткрытия);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ИнициализироватьФорму()
	ВидыНаборов=ВидыНаборовДанных();

	ЛокальныйИсточникДанных=ИсточникиДанных.Добавить();
	ЛокальныйИсточникДанных.Имя="ИсточникДанных1";
	ЛокальныйИсточникДанных.ТипИсточникаДанных="Local";

	НулевойНаборДанных=НаборыДанных.ПолучитьЭлементы().Добавить();
	НулевойНаборДанных.Имя="Наборы данных";
	НулевойНаборДанных.Вид=ВидыНаборов.Корень;

	ВариантНастроекПоУмолчанию=ВариантыНастроек.Добавить();
	ВариантНастроекПоУмолчанию.Имя="Основной";
	ВариантНастроекПоУмолчанию.Представление="Основной";

	ИдентификаторНулевогоНабораДанных=НулевойНаборДанных.ПолучитьИдентификатор();
	ИдентификаторСтрокиТекущегоВариантаНастроек=ВариантНастроекПоУмолчанию.ПолучитьИдентификатор();

	УстановитьУсловноеОформлениеФормы();
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформлениеФормы()
	ВидыПолейНаборов=ВидыПолейНаборовДанных();
	ВидыНаборов=ВидыНаборовДанных();
	
	//1. Для поля набора папка запретить редактировать колонку "Поле"
	НовоеУО=УсловноеОформление.Элементы.Добавить();
	НовоеУО.Использование=Истина;
	УИ_ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НовоеУО.Отбор,
		"Элементы.НаборыДанных.ТекущиеДанные.Поля.Вид", ВидыПолейНаборов.Папка);
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("НаборыДанныхПоляПоле");

	Оформление=НовоеУО.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ТолькоПросмотр"));
	Оформление.Использование=Истина;
	Оформление.Значение=Истина;
	
	//1.1 Для поля набора Набор запретить редактировать колонку "органичение использования"
	НовоеУО=УсловноеОформление.Элементы.Добавить();
	НовоеУО.Использование=Истина;
	УИ_ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НовоеУО.Отбор,
		"Элементы.НаборыДанных.ТекущиеДанные.Поля.Вид", ВидыПолейНаборов.Набор);
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляОграничениеИспользованияПоле");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляОграничениеИспользованияУсловие");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляОграничениеИспользованияГруппировка");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляОграничениеИспользованияПорядок");

	Оформление=НовоеУО.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ТолькоПросмотр"));
	Оформление.Использование=Истина;
	Оформление.Значение=Истина;
	
	//2. Для полей набора не поля блочим колонки для редактирования
	НовоеУО=УсловноеОформление.Элементы.Добавить();
	НовоеУО.Использование=Истина;
	УИ_ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НовоеУО.Отбор,
		"Элементы.НаборыДанных.ТекущиеДанные.Поля.Вид", ВидыПолейНаборов.Поле, ВидСравненияКомпоновкиДанных.НеРавно);
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляОграничениеИспользованияРеквизитовПоле");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляОграничениеИспользованияРеквизитовУсловие");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляОграничениеИспользованияРеквизитовГруппировка");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляОграничениеИспользованияРеквизитовПорядок");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("НаборыДанныхПоляРольПредставление");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляВыражениеПредставления");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляНаборДанныхПроверкиИерархии");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляПараметрНабораДанныхПроверкиИерархии");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляТипЗначения");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляДоступныеЗначения");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляОформление");
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПоляПараметрыРедактирования");

	Оформление=НовоеУО.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ТолькоПросмотр"));
	Оформление.Использование=Истина;
	Оформление.Значение=Истина;
	
	//3. имя параметра добавленного авторматически нельзя править
	НовоеУО=УсловноеОформление.Элементы.Добавить();
	НовоеУО.Использование=Истина;
	УИ_ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НовоеУО.Отбор,
		"Элементы.ПараметрыСКД.ТекущиеДанные.ДобавленАвтоматически", Истина);
	Поле=НовоеУО.Поля.Элементы.Добавить();
	Поле.Использование=Истина;
	Поле.Поле=Новый ПолеКомпоновкиДанных("ПараметрыСКДИмя");

	Оформление=НовоеУО.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ТолькоПросмотр"));
	Оформление.Использование=Истина;
	Оформление.Значение=Истина;

КонецПроцедуры

#Область СКД

&НаСервере
Процедура ПрочитатьИсточникиДанныхСКДВДанныеФормы(СКД)
	ИсточникиДанных.Очистить();

	Для Каждого ТекИсточник Из СКД.ИсточникиДанных Цикл
		НовыйИсточник=ИсточникиДанных.Добавить();
		ЗаполнитьЗначенияСвойств(НовыйИсточник, ТекИсточник);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьРольПоляНабораДанныхВДанныеФормы(РольРедактора, РольНабора)
	РольРедактора=НоваяСтруктураРедактированияРолиПоляНабораДанных();

	ЗаполнитьЗначенияСвойств(РольРедактора, РольНабора, , "ТипБухгалтерскогоОстатка,ТипОстатка");
	
	Если ЗначениеЗаполнено(РольНабора.ВыражениеВидаСчета) Тогда
		РольРедактора.Измерение = Ложь;
	КонецЕсли;
	
	РольРедактора.ТипБухгалтерскогоОстатка=Строка(РольНабора.ТипБухгалтерскогоОстатка);
	Если РольНабора.ТипОстатка = ТипОстаткаКомпоновкиДанных.Нет Тогда
		ТипОстатка = "Нет";
	ИначеЕсли РольНабора.ТипОстатка = ТипОстаткаКомпоновкиДанных.НачальныйОстаток Тогда
		ТипОстатка = "НачальныйОстаток";	
	ИначеЕсли РольНабора.ТипОстатка = ТипОстаткаКомпоновкиДанных.КонечныйОстаток Тогда
		ТипОстатка = "КонечныйОстаток";
	КонецЕсли;
	РольРедактора.ТипОстатка = ТипОстатка;

	РольРедактора.ПериодДополнительный=РольНабора.ТипПериода = ТипПериодаКомпоновкиДанных.Дополнительный;

	РольРедактора.Период=РольНабора.НомерПериода <> 0;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьПоляНабораСКДВДанныеФормы(НовыйНабор, СтрокаНабора)
	НовыйНабор.Поля.Очистить();

	ВидыПолейНабораДанныхСКД=ВидыПолейНаборовДанных();

	Для Каждого СтрокаПоля Из СтрокаНабора.Поля Цикл
		НовоеПоле=НовыйНабор.Поля.Добавить();
		Если ТипЗнч(СтрокаПоля) = Тип(ВидыПолейНабораДанныхСКД.Поле) Тогда
			НовоеПоле.Вид=ВидыПолейНабораДанныхСКД.Поле;

			ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаПоля, , "Оформление,ПараметрыРедактирования,Роль");

			ПрочитатьОграничениеИспользованияПоляСхемыКомпоновкиДанныхВДанныеФормы(
			СтрокаПоля.ОграничениеИспользованияРеквизитов, НовоеПоле.ОграничениеИспользованияРеквизитовПоле,
				НовоеПоле.ОграничениеИспользованияРеквизитовУсловие,
				НовоеПоле.ОграничениеИспользованияРеквизитовГруппировка,
				НовоеПоле.ОграничениеИспользованияРеквизитовПорядок);

			ПрочитатьОграничениеИспользованияПоляСхемыКомпоновкиДанныхВДанныеФормы(СтрокаПоля.ОграничениеИспользования,
				НовоеПоле.ОграничениеИспользованияПоле, НовоеПоле.ОграничениеИспользованияУсловие,
				НовоеПоле.ОграничениеИспользованияГруппировка, НовоеПоле.ОграничениеИспользованияПорядок);
				
			
		//Оформление
			СкопироватьОфорление(НовоеПоле.Оформление, СтрокаПоля.Оформление);

			ПрочитатьРольПоляНабораДанныхВДанныеФормы(НовоеПоле.Роль, СтрокаПоля.Роль);
			НовоеПоле.РольПредставление=ПредставлениеРолиПоляНабораДанных(НовоеПоле.Роль);

			НовоеПоле.ДоступныеЗначения=СтрокаПоля.ПолучитьДоступныеЗначения();
		ИначеЕсли ТипЗнч(СтрокаПоля) = Тип(ВидыПолейНабораДанныхСКД.Папка) Тогда
			НовоеПоле.Вид=ВидыПолейНабораДанныхСКД.Папка;

			ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаПоля);

			ПрочитатьОграничениеИспользованияПоляСхемыКомпоновкиДанныхВДанныеФормы(СтрокаПоля.ОграничениеИспользования,
				НовоеПоле.ОграничениеИспользованияПоле, НовоеПоле.ОграничениеИспользованияУсловие,
				НовоеПоле.ОграничениеИспользованияГруппировка, НовоеПоле.ОграничениеИспользованияПорядок);

		Иначе
			НовоеПоле.Вид=ВидыПолейНабораДанныхСКД.Набор;

			ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаПоля);
		КонецЕсли;
		НовоеПоле.Картинка=КартинкаВидаПоляНабораДанных(НовоеПоле.Вид, ВидыПолейНабораДанныхСКД);
	КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПрочитатьНаборыДанныхСКДВДанныеФормы(СКДНаборыДанных, СтрокаРодительскогоНабора = Неопределено)
	Если СтрокаРодительскогоНабора = Неопределено Тогда

		СтрокаНабораДляЗаполнения=НаборыДанных.НайтиПоИдентификатору(ИдентификаторНулевогоНабораДанных);
	Иначе
		СтрокаНабораДляЗаполнения=СтрокаРодительскогоНабора;
	КонецЕсли;

	СтрокаНабораДляЗаполнения.ПолучитьЭлементы().Очистить();

	ВидыНаборов=ВидыНаборовДанных();

	Для Каждого СтрокаНабора Из СКДНаборыДанных Цикл
		НовыйНабор=СтрокаНабораДляЗаполнения.ПолучитьЭлементы().Добавить();
		Если ТипЗнч(СтрокаНабора) = Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
			НовыйНабор.Вид=ВидыНаборов.Запрос;
			НовыйНабор.Картинка=БиблиотекаКартинок.УИ_НаборДанныхСКДЗапрос;
		ИначеЕсли ТипЗнч(СтрокаНабора) = Тип("НаборДанныхОбъектСхемыКомпоновкиДанных") Тогда
			НовыйНабор.Вид=ВидыНаборов.Объект;
			НовыйНабор.Картинка=БиблиотекаКартинок.УИ_НаборДанныхСКДОбъект;
		Иначе
			НовыйНабор.Вид=ВидыНаборов.Объединение;
			НовыйНабор.Картинка=БиблиотекаКартинок.УИ_НаборДанныхСКДОбъединение;
		КонецЕсли;
		ЗаполнитьЗначенияСвойств(НовыйНабор, СтрокаНабора, , "Поля");
		НовыйНабор.ЗапросОриганальный = НовыйНабор.Запрос;

		ПрочитатьПоляНабораСКДВДанныеФормы(НовыйНабор, СтрокаНабора);

		Если НовыйНабор.Вид = ВидыНаборов.Объединение Тогда
			ПрочитатьНаборыДанныхСКДВДанныеФормы(СтрокаНабора.Элементы, НовыйНабор);
		ИначеЕсли НовыйНабор.Вид = ВидыНаборов.Запрос Тогда
			ЗаполнитьПоляНабораДанныхПриИзмененииЗапросаНаСервере(НовыйНабор.ПолучитьИдентификатор());
			ЗаполнитьПараметрыСКДПриИзмененииЗапросаНабора(НовыйНабор.ПолучитьИдентификатор());
		ИначеЕсли НовыйНабор.Вид = ВидыНаборов.Объект Тогда
			РодительскийНабор=НовыйНабор.ПолучитьРодителя();
			Если РодительскийНабор.Вид = ВидыНаборов.Объединение Тогда
				ЗаполнитьПоляНабораДанныхОбъединениеПоПодчиненнымЗапросам(РодительскийНабор.ПолучитьИдентификатор());
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПрочитатьСвязиНаборовДанныхСКДВДанныеФормы(СКД)
	СвязиНаборовДанных.Очистить();

	Для Каждого ТекДанные Из СКД.СвязиНаборовДанных Цикл
		НовыеДанные=СвязиНаборовДанных.Добавить();
		ЗаполнитьЗначенияСвойств(НовыеДанные, ТекДанные);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьОграничениеИспользованияПоляСхемыКомпоновкиДанныхВДанныеФормы(ОграничениеИспользования, Поле,
	Условие, Группа, Порядок)

	Поле=ОграничениеИспользования.Поле;
	Условие=ОграничениеИспользования.Условие;
	Группа=ОграничениеИспользования.Группировка;
	Порядок=ОграничениеИспользования.Порядок;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьВычисляемыеПоляСКДВДанныеФормы(СКД)
	ВычисляемыеПоля.Очистить();

	Для Каждого ТекДанные Из СКД.ВычисляемыеПоля Цикл
		НовыеДанные=ВычисляемыеПоля.Добавить();
		ЗаполнитьЗначенияСвойств(НовыеДанные, ТекДанные, , "ВыраженияУпорядочивания,Оформление,ПараметрыРедактирования");

		ПрочитатьОграничениеИспользованияПоляСхемыКомпоновкиДанныхВДанныеФормы(ТекДанные.ОграничениеИспользования,
			НовыеДанные.ОграничениеИспользованияПоле, НовыеДанные.ОграничениеИспользованияУсловие,
			НовыеДанные.ОграничениеИспользованияГруппировка, НовыеДанные.ОграничениеИспользованияПорядок);
			
		//Оформление
		СкопироватьОфорление(НовыеДанные.Оформление, ТекДанные.Оформление);

		НовыеДанные.ДоступныеЗначения=ТекДанные.ПолучитьДоступныеЗначения();
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьПоляИтоговСКДВДанныеФормы(СКД)
	Ресурсы.Очистить();

	Для Каждого ТекДанные Из СКД.ПоляИтога Цикл
		НовыеДанные=Ресурсы.Добавить();
		ЗаполнитьЗначенияСвойств(НовыеДанные, ТекДанные, , "Группировки");

		Для Каждого Элемент Из ТекДанные.Группировки Цикл
			НовыеДанные.Группировки.Добавить(Элемент);
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПрочитатьПараметрыСКДВДанныеФормы(СКД)
	ПараметрыСКД.Очистить();

	Для Каждого ТекДанные Из СКД.Параметры Цикл
		НовыеДанные=ПараметрыСКД.Добавить();
		ЗаполнитьЗначенияСвойств(НовыеДанные, ТекДанные, , "ПараметрыРедактирования");

		НовыеДанные.ИспользованиеВсегда=ТекДанные.Использование = ИспользованиеПараметраКомпоновкиДанных.Всегда;

		НовыеДанные.ДоступныеЗначения=ТекДанные.ПолучитьДоступныеЗначения();
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьВариантыНастроекСКДВДанныеФормы(СКД)
	ВариантыНастроек.Очистить();

	Для Каждого СтрокаВарианта Из СКД.ВариантыНастроек Цикл
		НовыеДанные=ВариантыНастроек.Добавить();
		НовыеДанные.Имя=СтрокаВарианта.Имя;
		НовыеДанные.Представление=СтрокаВарианта.Представление;
		НовыеДанные.Настройки=УИ_ОбщегоНазначения.ЗначениеВСтрокуXML(СтрокаВарианта.Настройки);
	КонецЦикла;

	ИдентификаторСтрокиТекущегоВариантаНастроек=ВариантыНастроек[0].ПолучитьИдентификатор();

	КомпоновщикТекущихНастроек.ЗагрузитьНастройки(СтрокаВарианта.Настройки);
КонецПроцедуры

&НаСервере
Процедура ПрочитатьСКДВДанныеФормы(СКД)
	Если ЭтоАдресВременногоХранилища(АдресПервоначальнойСхемыКомпоновкиДанных) Тогда
		АдресПервоначальнойСхемыКомпоновкиДанных=ПоместитьВоВременноеХранилище(СКД,
			АдресПервоначальнойСхемыКомпоновкиДанных);
	Иначе
		АдресПервоначальнойСхемыКомпоновкиДанных=ПоместитьВоВременноеХранилище(СКД, УникальныйИдентификатор);
	КонецЕсли;

	ПрочитатьПараметрыСКДВДанныеФормы(СКД);
	ПрочитатьИсточникиДанныхСКДВДанныеФормы(СКД);
	ПрочитатьНаборыДанныхСКДВДанныеФормы(СКД.НаборыДанных);
	ПрочитатьСвязиНаборовДанныхСКДВДанныеФормы(СКД);

	ПрочитатьВычисляемыеПоляСКДВДанныеФормы(СКД);
	ПрочитатьПоляИтоговСКДВДанныеФормы(СКД);

	ПрочитатьВариантыНастроекСКДВДанныеФормы(СКД);

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьИсточникиДанныхСКДПоДаннымФормы(СКД)
	СКД.ИсточникиДанных.Очистить();

	Для Каждого ТекИсточник Из ИсточникиДанных Цикл
		НовыйИсточник=СКД.ИсточникиДанных.Добавить();
		ЗаполнитьЗначенияСвойств(НовыйИсточник, ТекИсточник);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьОграничениеИспользованияПоляСхемыКомпоновкиДанных(ОграничениеИспользования, Поле, Условие, Группа,
	Порядок)

	ОграничениеИспользования.Поле=Поле;
	ОграничениеИспользования.Условие=Условие;
	ОграничениеИспользования.Группировка=Группа;
	ОграничениеИспользования.Порядок=Порядок;
КонецПроцедуры

&НаСервере
Процедура СкопироватьОфорление(ОформлениеПриемник, ОформлениеИсточник)
	Для Каждого ТекПараметрОформления Из ОформлениеИсточник.Элементы Цикл
		ЗначениеПараметра=ОформлениеПриемник.НайтиЗначениеПараметра(ТекПараметрОформления.Параметр);
		Если ЗначениеПараметра = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		ЗаполнитьЗначенияСвойств(ЗначениеПараметра, ТекПараметрОформления);
	КонецЦикла;

КонецПроцедуры

&НаСервере
Функция НоваяСтруктураРедактированияРолиПоляНабораДанных()
	Роль=Новый Структура;
	Роль.Вставить("ВыражениеВидаСчета", "");
	Роль.Вставить("ГруппаОстатка", "");
	Роль.Вставить("ИгнорироватьЗначенияNULL", Ложь);
	Роль.Вставить("Измерение", Ложь);
	Роль.Вставить("Период", Ложь);
	Роль.Вставить("НомерПериода", 0);
	Роль.Вставить("Обязательное", Ложь);
	Роль.Вставить("Остаток", Ложь);
	Роль.Вставить("ПолеСчета", "");
	Роль.Вставить("РодительскоеИзмерение", "");
	Роль.Вставить("Счет", Ложь);
	Роль.Вставить("ТипБухгалтерскогоОстатка", "Нет");
	Роль.Вставить("ТипОстатка", "Нет");
	Роль.Вставить("ПериодДополнительный", Ложь);

	Возврат Роль;
КонецФункции

&НаСервере
Процедура ЗаполнитьРольПоляНабораДанныхПоДаннымФормы(РольНабора, РольРедактора)
	Если РольРедактора = Неопределено Тогда
		РольРедактора=НоваяСтруктураРедактированияРолиПоляНабораДанных();
	КонецЕсли;

	ЗаполнитьЗначенияСвойств(РольНабора, РольРедактора, , "ТипБухгалтерскогоОстатка,ТипОстатка");
	РольНабора.ТипБухгалтерскогоОстатка=ТипБухгалтерскогоОстаткаКомпоновкиДанных[РольРедактора.ТипБухгалтерскогоОстатка];
	РольНабора.ТипОстатка=ТипОстаткаКомпоновкиДанных[РольРедактора.ТипОстатка];

	Если РольРедактора.ПериодДополнительный Тогда
		РольНабора.ТипПериода=ТипПериодаКомпоновкиДанных.Дополнительный;
	Иначе
		РольНабора.ТипПериода=ТипПериодаКомпоновкиДанных.Основной;
	КонецЕсли;

	Если Не РольРедактора.Период Тогда
		РольНабора.НомерПериода=0;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПоляНабораСКДПоДаннымФормы(НовыйНабор, СтрокаНабора)
	НовыйНабор.Поля.Очистить();
	ВидыПолей=ВидыПолейНаборовДанных();

	Для Каждого СтрокаПоля Из СтрокаНабора.Поля Цикл
		НовоеПоле=НовыйНабор.Поля.Добавить(Тип(СтрокаПоля.Вид));
		Если СтрокаПоля.Вид = ВидыПолей.Поле Тогда
			ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаПоля, , "Оформление,ПараметрыРедактирования,Роль");
			
			//Оформление
			СкопироватьОфорление(НовоеПоле.Оформление, СтрокаПоля.Оформление);

			ЗаполнитьРольПоляНабораДанныхПоДаннымФормы(НовоеПоле.Роль, СтрокаПоля.Роль);
			УстановитьДоступныеЗначенияУЭлементаСКД(НовоеПоле, СтрокаПоля.ДоступныеЗначения);

			ЗаполнитьОграничениеИспользованияПоляСхемыКомпоновкиДанных(НовоеПоле.ОграничениеИспользованияРеквизитов,
				СтрокаПоля.ОграничениеИспользованияРеквизитовПоле, СтрокаПоля.ОграничениеИспользованияРеквизитовУсловие,
				СтрокаПоля.ОграничениеИспользованияРеквизитовГруппировка,
				СтрокаПоля.ОграничениеИспользованияРеквизитовПорядок);

		Иначе
			ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаПоля);
		КонецЕсли;

		Если СтрокаПоля.Вид <> ВидыПолей.Набор Тогда
			ЗаполнитьОграничениеИспользованияПоляСхемыКомпоновкиДанных(НовоеПоле.ОграничениеИспользования,
				СтрокаПоля.ОграничениеИспользованияПоле, СтрокаПоля.ОграничениеИспользованияУсловие,
				СтрокаПоля.ОграничениеИспользованияГруппировка, СтрокаПоля.ОграничениеИспользованияПорядок);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаборыДанныхСКДПоДаннымФормы(СКДНаборыДанных, СтрокаРодительскогоНабора = Неопределено)
//	СКД=Новый СхемаКомпоновкиДанных;
	Если СтрокаРодительскогоНабора = Неопределено Тогда

		СтрокаНабораДляКопирования=НаборыДанных.НайтиПоИдентификатору(ИдентификаторНулевогоНабораДанных);
	Иначе
		СтрокаНабораДляКопирования=СтрокаРодительскогоНабора;
	КонецЕсли;

	СКДНаборыДанных.Очистить();

	Для Каждого СтрокаНабора Из СтрокаНабораДляКопирования.ПолучитьЭлементы() Цикл
		НовыйНабор=СКДНаборыДанных.Добавить(Тип(СтрокаНабора.Вид));
		ЗаполнитьЗначенияСвойств(НовыйНабор, СтрокаНабора, , "Поля");

		ЗаполнитьПоляНабораСКДПоДаннымФормы(НовыйНабор, СтрокаНабора);

		Если ТипЗнч(НовыйНабор) = Тип("НаборДанныхОбъединениеСхемыКомпоновкиДанных") Тогда
			ЗаполнитьНаборыДанныхСКДПоДаннымФормы(НовыйНабор.Элементы, СтрокаНабора);
		КонецЕсли;

	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСвязиНаборовДанныхСКДПоДаннымФормы(СКД)
	СКД.СвязиНаборовДанных.Очистить();

	Для Каждого ТекДанные Из СвязиНаборовДанных Цикл
		НовыеДанные=СКД.СвязиНаборовДанных.Добавить();
		ЗаполнитьЗначенияСвойств(НовыеДанные, ТекДанные);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьВычисляемыеПоляСКДПоДаннымФормы(СКД)
	СКД.ВычисляемыеПоля.Очистить();

	Для Каждого ТекДанные Из ВычисляемыеПоля Цикл
		НовыеДанные=СКД.ВычисляемыеПоля.Добавить();
		ЗаполнитьЗначенияСвойств(НовыеДанные, ТекДанные, , "ВыраженияУпорядочивания,Оформление,ПараметрыРедактирования");

		ЗаполнитьОграничениеИспользованияПоляСхемыКомпоновкиДанных(НовыеДанные.ОграничениеИспользования,
			ТекДанные.ОграничениеИспользованияПоле, ТекДанные.ОграничениеИспользованияУсловие,
			ТекДанные.ОграничениеИспользованияГруппировка, ТекДанные.ОграничениеИспользованияПорядок);
			
		//Оформление
		СкопироватьОфорление(НовыеДанные.Оформление, ТекДанные.Оформление);

		УстановитьДоступныеЗначенияУЭлементаСКД(НовыеДанные, ТекДанные.ДоступныеЗначения);
	КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоляИтоговСКДПоДаннымФормы(СКД)
	СКД.ПоляИтога.Очистить();

	Для Каждого ТекДанные Из Ресурсы Цикл
		НовыеДанные=СКД.ПоляИтога.Добавить();
		ЗаполнитьЗначенияСвойств(НовыеДанные, ТекДанные, , "Группировки");

		Для Каждого Элемент Из ТекДанные.Группировки Цикл
			НовыеДанные.Группировки.Добавить(Элемент.Значение);
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПараметрыСКДПоДаннымФормы(СКД)
	СКД.Параметры.Очистить();

	Для Каждого ТекДанные Из ПараметрыСКД Цикл
		НовыеДанные=СКД.Параметры.Добавить();
		ЗаполнитьЗначенияСвойств(НовыеДанные, ТекДанные, , "ПараметрыРедактирования");

		Если ТекДанные.ИспользованиеВсегда Тогда
			НовыеДанные.Использование=ИспользованиеПараметраКомпоновкиДанных.Всегда;
		Иначе
			НовыеДанные.Использование=ИспользованиеПараметраКомпоновкиДанных.Авто;
		КонецЕсли;

		УстановитьДоступныеЗначенияУЭлементаСКД(НовыеДанные, ТекДанные.ДоступныеЗначения);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура УстановитьДоступныеЗначенияУЭлементаСКД(Элемент, ДоступныеЗначения)
	Если ДоступныеЗначения.Количество() = 0 Тогда
//		Элемент.УстановитьДоступныеЗначения(ДоступныеЗначения);
//	Иначе
		Элемент.УстановитьДоступныеЗначения(ДоступныеЗначения);
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьВариантыНастроекСКДПоДаннымФормы(СКД)
	СКД.ВариантыНастроек.Очистить();

	Для Каждого СтрокаВарианта Из ВариантыНастроек Цикл
		НовыеДанные=СКД.ВариантыНастроек.Добавить();
		НовыеДанные.Имя=СтрокаВарианта.Имя;
		НовыеДанные.Представление=СтрокаВарианта.Представление;
		Если ЗначениеЗаполнено(СтрокаВарианта.Настройки) Тогда
			УИ_ОбщегоНазначенияКлиентСервер.СкопироватьНастройкиКомпоновкиДанных(НовыеДанные.Настройки,
				УИ_ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаВарианта.Настройки));
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура СобратьСКДПоДаннымФормы(ВключитьВариантыНастроек = Ложь)
	Если ЭтоАдресВременногоХранилища(АдресПервоначальнойСхемыКомпоновкиДанных) Тогда
		СКД=ПолучитьИзВременногоХранилища(АдресПервоначальнойСхемыКомпоновкиДанных);
		Если ТипЗнч(СКД) <> Тип("СхемаКомпоновкиДанных") Тогда
			СКД=Новый СхемаКомпоновкиДанных;
		КонецЕсли;
	Иначе
		СКД=Новый СхемаКомпоновкиДанных;
	КонецЕсли;
	ЗаполнитьИсточникиДанныхСКДПоДаннымФормы(СКД);
	ЗаполнитьНаборыДанныхСКДПоДаннымФормы(СКД.НаборыДанных);
	ЗаполнитьСвязиНаборовДанныхСКДПоДаннымФормы(СКД);
	ЗаполнитьВычисляемыеПоляСКДПоДаннымФормы(СКД);
	ЗаполнитьПоляИтоговСКДПоДаннымФормы(СКД);
	ЗаполнитьПараметрыСКДПоДаннымФормы(СКД);

	Если ВключитьВариантыНастроек Тогда
		СохранитьВТаблицуФормыНастройкуТекущегоВариантаНастроек();
		ЗаполнитьВариантыНастроекСКДПоДаннымФормы(СКД);
	КонецЕсли;

	Если ЭтоАдресВременногоХранилища(АдресСхемыКомпоновкиДанных) Тогда
		АдресСхемыКомпоновкиДанных=ПоместитьВоВременноеХранилище(СКД, АдресСхемыКомпоновкиДанных);
	Иначе
		АдресСхемыКомпоновкиДанных=ПоместитьВоВременноеХранилище(СКД, УникальныйИдентификатор);
	КонецЕсли;

	ИнициализироватьКомпоновщикНастроекПоСобраннойСКД();
КонецПроцедуры

&НаСервере
Функция ЗапросНабораКорректен(ИдентификаторСтрокиНабора)
	СтрокаНабора=НаборыДанных.НайтиПоИдентификатору(ИдентификаторСтрокиНабора);
	
	СхемаЗапроса=Новый СхемаЗапроса;
	Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше_8_3_14() Тогда
		СхемаЗапроса.РежимКомпоновкиДанных=Истина;
	КонецЕсли;
	
	Попытка
		СхемаЗапроса.УстановитьТекстЗапроса(СтрокаНабора.Запрос);
		Возврат Истина;
	Исключение
		Возврат Ложь;
	КонецПопытки;
КонецФункции

#КонецОбласти

#КонецОбласти
ВидыНаборовДанных=ВидыНаборовДанных();
ВидыПолейНаборовДанных=ВидыПолейНаборовДанных();